애플리케이션을 루트로 실행하지 않고 Linux PAM을 통해 비밀번호 변경

애플리케이션을 루트로 실행하지 않고 Linux PAM을 통해 비밀번호 변경

제가 작성 중인 애플리케이션에는 비밀번호 변경 기능이 있습니다. 하지만 루트가 아니어도 계정 관리 부분을 실행할 수 있는지 알고 싶습니다.

이제 관리하려는 사용자로 실행하면 비밀번호를 변경할 수 없는 문제가 발생했습니다. 주어진 비밀번호로 먼저 인증하여 비밀번호가 올바른지 확인합니다. (인증 모듈의 다른 부분을 별도로 호출합니다.) chauthtok사용자에 대해 변경을 호출할 때만 pamtest대화 함수의 디버그 출력이 발생합니다.

START PAM CHANGE PASSWORD
PAM_CONV start [('Changing password for pamtest.', 4)]
PAM_CONV iter: Changing password for pamtest. 4
PAM_CONV end: [('', 0)]
PAM_CONV start [('(current) UNIX password: ', 1)]
PAM_CONV iter: (current) UNIX password:  1
PAM_CONV end: [(u'5ACN5pbmDFBVMHp', 0)]
PAM_CONV start [('Enter new UNIX password: ', 1)]
PAM_CONV iter: Enter new UNIX password:  1
PAM_CONV end: [(u'pdJb7ffsQTHWw4V', 0)]
PAM_CONV start [('Retype new UNIX password: ', 1)]
PAM_CONV iter: Retype new UNIX password:  1
PAM_CONV end: [(u'pdJb7ffsQTHWw4V', 0)]
Pass change failed for pamtest! '' (('Authentication token manipulation error', 20))
response:False

디버그 플래그는 pam_unix.sorsyslog 파일 auth.log에서 이 줄을 두 번 제공합니다 .

<date> <time>   <system>    python  pam_unix(passwd:chauthtok): username [pamtest] obtained

이로 인해 변경된 비밀번호를 섀도우 파일에 쓰는 데 문제가 있다고 생각됩니다. 루트가 쓰기 권한을 가진 유일한 사람이기 때문일 수 있습니다. 루트로 실행하면 코드가 작동합니다.

이것이 올바른 가정인가요? 그렇다면 일반적으로 모듈을 루트로 실행하여 수행됩니까? 아니면 섀도우 파일에만 쓸 수 있는 권한만 가진 특정 사용자를 생성하는 등의 다른 옵션을 사용할 수 있습니까?

답변1

이로 인해 변경된 비밀번호를 섀도우 파일에 쓰는 데 문제가 있다고 생각됩니다. 루트가 쓰기 권한을 가진 유일한 사람이기 때문일 수 있습니다. 루트로 실행하면 코드가 작동합니다.

이것이 올바른 가정인가요?

예. /etc/shadow루트로만 작성할 수 있으므로 루트 권한이 있는 경우에만 프로그램을 실행할 수 있습니다.

아니면 섀도우 파일에만 쓰기 권한이 있는 특정 사용자를 생성하는 등의 다른 옵션을 사용할 수 있습니까?

"setuid 루트" 프로그램을 작성하세요. setuid는 어떤 사용자가 프로그램을 시작하더라도 프로그램이 항상 루트 권한을 갖는다는 것을 의미합니다. 그런 다음 프로그램은 다음을 보장해야 합니다.

  • 전화를 거는 사용자는 자신의 비밀번호만 변경할 수 있습니다.
  • 전화를 건 사용자가 올바른 이전 비밀번호를 제공했습니다.
  • 호출 사용자는 루트 쉘 실행과 같은 완전히 다른 작업을 수행하기 위해 프로그램을 조작할 수 없습니다.

물론 setuid 프로그램을 작성할 때는 매우 주의해야 합니다. 귀하의 프로그램은 이제 호출하는 사용자보다 더 많은 권한을 가지므로 공격자는 자신의 권한을 루트로 승격시키기 위해 프로그램의 버그를 악용하려고 시도할 것입니다.

답변2

비공개 그룹(예: "shadow")이 섀도우 파일을 읽을 수 있도록 만들고 해당 파일에서 애플리케이션이 setgid를 실행하도록 할 수 있습니다. 이는 최소한 시스템이 손상된 경우 시스템의 모든 파일이 아닌 사용자 데이터베이스만 읽을 수 있도록 보장합니다. 그러나 프로세스가 수퍼유저이거나 해당 시점에 적절한 기능이 연결되어 활성화되지 않은 경우 애플리케이션은 프로세스의 자격 증명을 변경할 수 없습니다.

관련 정보