왜 'su'를 사용하여 빈 비밀번호를 가진 사용자로 전환할 수 없나요?

왜 'su'를 사용하여 빈 비밀번호를 가진 사용자로 전환할 수 없나요?

다음 이름의 새 계정을 만듭니다 test.

$ sudo useradd test

test현재 비밀번호가 없습니다. 그래서

$ su test

작동하지 않습니다. 시도하면 test비밀번호를 입력하라는 메시지가 표시됩니다. 하나도 없습니다. 이는 빈 비밀번호와는 다르기 때문에 빈 비밀번호에 대해 Enter를 누르면 "su: Authentication failed"라는 메시지가 나타납니다.

tty로 전환하고 다음으로 로그인을 시도하는 경우에도 마찬가지입니다 test. 빈 비밀번호는 허용되지 않습니다.

이제 test빈 비밀번호를 지정하십시오.

$ sudo passwd -d test

test이제 빈 문자열을 비밀번호로 제공하여 tty에 로그인할 수 있습니다. 그러나 시도하면

$ su test

이번에도 여전히 "su: Authentication failed"라는 메시지가 표시됩니다. 세션이 사용자로 전환되지 않습니다 test.

왜 이런거야?

답변1

출력 결과로 볼 때 ldd /bin/su, su바이너리는 pam라이브러리( libpam*)를 사용하여 컴파일되므로 인증, 계정 관리, 세션 시작 등과 같은 작업은 에서 컴파일됩니다 pam.

다음은 일반적인 Ubuntu 시스템을 관리하는 su방법 입니다 pam. 다른 배포판을 사용하는 경우 유사한 방법을 찾아야 합니다.

pam 규칙은 su파일에 정의되어 있습니다 /etc/pam.d/su. 이 파일에는 이름에서 알 수 있는 작업을 처리하기 위한(그리고 다른 활성화된 서비스에서 사용하기 위한) 일반 템플릿과 동일한 디렉터리에 common-auth, common-passwd, 파일도 포함되어 있습니다.common-sessionpam

내 시스템의 /etc/pam.d/su맨 아래에는 다음이 있습니다.

@include common-auth
@include common-account
@include common-session

처음 몇 줄은 빈 비밀번호 확인을 처리하지 않으며 주로 pam_unix모듈의 작업입니다.

다음이 /etc/pam.d/common-auth있습니다:

auth    [success=1 default=ignore]      pam_unix.so nullok_secure

에서 man pam_unix:

누록

이 모듈의 기본 작업은 공식 비밀번호가 비어 있는 경우 사용자가 서비스에 액세스하는 것을 허용하지 않는 것입니다. nullok 매개변수는 이 기본값을 무시하고 빈 암호를 가진 모든 사용자가 서비스에 액세스할 수 있도록 허용합니다.

nullok_secure

이 모듈의 기본 작업은 공식 비밀번호가 비어 있는 경우 사용자가 서비스에 액세스하는 것을 허용하지 않는 것입니다. nullok_secure 매개변수는 이 기본값을 무시하고 PAM_TTY 값을 /etc/securetty에 있는 값 중 하나로 설정하여 빈 비밀번호를 가진 모든 사용자가 서비스에 액세스할 수 있도록 허용합니다.

보시다시피, nullok_secure이 옵션을 설정 하면 위와 같이 환경변수를 설정하지 않는 이상 PAM_TTY비밀번호가 비어있는 사용자는 허용되지 않습니다 su.

따라서 빈 비밀번호를 가진 모든 사용자가 이 작업을 수행하도록 허용하려면 모듈 에 매개변수를 제공 su해야 합니다 .nullokpam_unix

auth    [success=1 default=ignore]      pam_unix.so nullok

해당 common-auth파일은 다른 많은 서비스에서 사용되기 때문에 안전하지 않으며 su단지 이 작업을 수행하기 위해서라도 수행해서는 안 됩니다. (테스트용으로는 한 번 설정한 후 원래 상태로 되돌릴 수 있습니다. 하지만 테스트하려면 파일을 /etc/pam.d/su엉망으로 만드는 것보다 모든 로직을 파일로 병합한 다음 변경 사항을 수정하는 것이 좋습니다 common-*.)

답변2

에서 man useradd:

-p, --password PASSWORD 
The encrypted password, as returned by crypt(3). The default is to disable the password.
Note: This option is not recommended because the password (or encrypted password) will be visible by users listing the processes. 

당신은 그것을 사용하고 있지 않으므로 --password사용자 ID에는 특별한 "비활성화" 비밀번호가 할당됩니다. 빈 비밀번호와 다릅니다.

즉, 이것은 보안 구멍이 될 것입니다.

관련 정보