인증 메커니즘을 올바르게 이해했다면 로그인 프롬프트에 자격 증명을 입력하면 비밀번호의 해시가 계산된 다음 해당 해시가 어딘가에 저장된 해시와 비교됩니다. 올바르게 기억한다면 "어딘가"가 /etc/shadow
일치합니다. 인증은 성공하고, 그렇지 않으면 인증이 실패합니다.
제 질문은 어떤 프로그램, 즉 어떤 바이너리가 입력된 비밀번호의 해시를 계산하는지입니다. 아니면 커널에 의해 구현됩니까?
답변1
아니요특정한바이너리는 해시됩니다. 이는 라이브러리 호출을 통해 수행됩니다 crypt(3)
. 따라서 이론상으로는 모든 프로그램( perl
스크립트 포함)이 해시 값을 생성할 수 있습니다. 예를 들어
perl -e 'print crypt("hello","\$6\$0abcdef")'
$6$0abcdef$JhsHMeFo8zYQPa8/HDXGoMWZgIxiCJKu2BQqCGjkyh/NadMax6GiJWQOT5ZL7POkUzrwbvL/Yhbx9f8XtLr.F/
이 기능에 대해 자세히 알아볼 수 있습니다 man 3 crypt
.
이제 일반적인 Unix 로그인 프로세스는 약간 복잡합니다. 일반적으로 우리는 PAM("플러그 가능한 인증 모듈") 스택을 사용합니다. 이는 NSS("Name Service Exchange")와 함께 비밀번호 저장 방법 및 위치, 인증 방법에 있어 많은 유연성을 제공합니다.
PAM을 사용할 때 프로그램은 자신을 호출하지 않고 crypt()
PAM 스택을 호출하고 무엇을 사용할지 결정합니다.
매우 일반적인 패턴은 호출을 완료하고 (또는 LDAP 또는 다른 곳에서) 비교가 수행되는 위치 pam_unix
를 사용하는 것입니다.pam_unix.so
crypt()
/etc/shadow
이 PAM/NSS 조합은 모든 프로그램이 이를 인식하지 않고도 새로운 인증 방법(예: Active Directory 도메인 가입)을 추가할 수 있으며 PAM 구성만 업데이트하면 "마법"이 일어날 수 있다는 점에서 매우 강력합니다.
답변2
로그인 프롬프트에 자격 증명을 입력하면 비밀번호의 해시가 계산된 다음 올바르게 기억하는 경우 "어딘가"에 저장된 해시와 비교됩니다
/etc/shadow
.
이것은 기본적으로 정확합니다(웹상의 많은 단순화된 설명보다 더 정확하므로 잘 수행되었습니다). 보다 정확하게는 데이터 흐름은 다음과 같습니다.
- 일부 구성 파일을 읽으십시오. 나는 이것이 정상적인 기본값을 가진 로컬 계정과 공통된 상황으로 이어진다고 가정합니다. 이 단계의 다른 가능성은 네트워크 계정 데이터베이스를 쿼리하거나, 비밀번호 기반이 아닌 인증을 수행하거나, 비밀번호 해시의 다른 위치를 사용하여 비밀번호 기반 인증을 수행하는 것입니다(그러나 이는 덜 일반적입니다).
- 사용자 비밀번호를 입력하세요인. (이는 다음 단계 이후에 발생할 수 있습니다.)
- 원하는 사용자 이름이 포함된 줄을 찾으세요.
/etc/shadow
"암호화된 비밀번호" 필드를 추출하세요. 이 단계에는 읽기 권한이 필요합니다/etc/shadow
. - Shadow field를 구성 + 솔트의 두 부분²으로 나눕니다.에스예상되는 해시 값시간. 통과인그리고에스도착하다
crypt
라이브러리 함수 1, 결과 얻기오른쪽. 비교하다오른쪽그리고시간: 같으면 비밀번호 인증에 성공하고, 다르면 비밀번호 인증에 실패합니다. - 비밀번호 기반이 아닌 방법이 있는 경우 사용자 인증을 진행하세요.
- 인증에 성공하면 사용자가 로그인되고, 그렇지 않으면 오류가 발생합니다.
일반적인 임베디드 Linux 시스템에서는 이러한 모든 단계가 동일한 프로그램 내에서 발생합니다.login
콘솔 로그인의 경우,su
또는sudo
권한을 승격할 때,dropbear
SSH 로그인 등에 사용됩니다. 일반적으로 임베디드 시스템에는 이 시점에서 런타임 구성 기능이 없으므로 1단계를 완전히 생략할 수 있습니다. 함수의 구현은 crypt
시스템의 표준 라이브러리에서 나옵니다. 예:머슬러. 따라서 계산을 수행하는 코드는 비슷한 위치에 저장되고 /lib/libc.so
, 주변 구성 및 데이터베이스 조회를 수행하는 코드는 비슷한 /bin/login
위치에 저장됩니다. 커널은 기본 입력 및 출력 기본 요소(파일 열기, 파일 읽기 등)를 제공하는 것 이외의 인증에는 관여하지 않습니다. 커널은 인증 후 프로세스의 권한을 추적하기 위해 인증 후에 더 직접적으로 관여합니다. ( /etc/shadow
인증자가 항상 루트로 실행되지 않는 경우 읽기 위한 임시 권한 상승이 포함될 수도 있습니다.)
일반적인 비임베디드 Unix 시스템에서는 이 프로세스의 대부분이 하청 계약을 통해 이루어집니다.폴리아크릴아미드도서관. PAM은 기본 라이브러리( /lib/libpam.so.0
여기 및 다른 곳의 정확한 경로는 시스템에 따라 다름)와 여러 보조 라이브러리 및 프로그램으로 구성됩니다. 모두 동일한 소프트웨어 제품군의 일부이므로 자세히 설명하지 않겠습니다. 유효성 검사기는 일련의 호출을 호출합니다.PAM 라이브러리의 기능사용자를 인증하고 인증 성공(세션 설정) 후 수행할 작업을 결정합니다. 제 생각에는pam_authenticate
1단계와 3~5단계를 수행하는 기능의 일부입니다(PAM의 이쪽 측면에 익숙하지 않기 때문에 잘 모르겠습니다).
PAM을 사용하면 3~4단계(비밀번호 해시 찾기 및 이에 대한 비밀번호 유효성 검사)가 에서 구체적으로 처리됩니다 /lib/security/pam_unix.so
.기존 비밀번호 기반 인증을 위한 PAM 모듈. 모듈 pam_unix
은 인증을 수행하는 프로세스의 컨텍스트에서 실행됩니다. 이 프로세스는 읽기 권한이 충분하지 않을 수 있습니다 /etc/shadow
(그러나 해당 권한을 얻으려면 충분한 권한으로 실행되어야 함3). 비밀번호 해시에 접근할 수 있는 코드의 양을 최소화하기 위해 이 부분은 전용 프로그램에서 실행됩니다.unix_chkpwd
. 프로그램은 비밀번호 해시를 읽고 함수를 /etc/shadow
호출한 후 출력을 확인합니다.crypt
1 비밀번호는 암호화되지 않고 해시되어 있기 때문에 오해의 소지가 있는 이름입니다. 원래 비밀번호를 찾기 위해 내용을 "해독"할 수 없습니다.
² 역사적인 이유로 인해 인터페이스가 약간 이상합니다. 의 필드에는 /etc/shadow
알고리즘 식별자, 일부 비용 매개변수, 솔트 문자열 및 예상 출력 문자열의 4개 부분이 포함됩니다. 어떤 알고리즘 식별자를 선택해야 할까요?비밀번호 해싱사용된 알고리즘 - 이름에서 알 수 있듯이 이는 해싱 알고리즘이 아닙니다. 예를 들어 참조하십시오.모든 Linux 배포판은 동일한 암호화 해시 함수를 사용합니까?더 많은 정보를 알고 싶습니다. 비용 매개변수는 알고리즘에 따라 다릅니다. 비용이 높을수록 일반 인증이 느려지지만 공격자가 해시를 검색하는 경우 비밀번호를 해독하는 것이 더 어려워집니다. 솔트는 고유하며 다중 계정 공격(예: 조직 내에서 발판을 마련하기 위해 가장 취약한 비밀번호를 사용하여 직원의 계정에 침입하려는 시도)을 방지합니다. 내부적으로 이 crypt
함수는 알고리즘 식별자를 사용하여 호출할 도우미 함수를 결정하며 일부 시스템에서는 도우미 함수가 다른 라이브러리에 있을 수 있습니다.
일반적으로 프로그램( login
, su
, ...)은 루트 권한으로 시작되고 루트(적어도 그 자체의 일부)를 그대로 유지합니다.저장된 사용자 ID하지만 바꿨어유효한 사용자 ID전용 시스템 사용자(로그인한 경우) 또는 호출하는 사용자(권한이 상승된 경우). 이는 공격자가 로그인 프로그램에 대한 부분적인 제어권(예: 파일 읽기)을 얻을 수 있지만 임의 코드를 실행할 수는 없는 로그인 프로그램의 보안 취약점 위험을 최소화합니다. 권한을 높이려면 전용 시스템 호출을 호출해야 합니다.seteuid
.
답변3
입력 비밀번호의 해시 계산을 담당하는 바이너리는 일반적으로 인증 시스템의 일부이며 커널에 의해 구현되지 않습니다. 대부분의 Linux 배포판에서 이는 다음이라는 프로그램에 의해 처리됩니다.토굴또는비밀번호, 사용되는 특정 바이너리는 배포판에 따라 다를 수 있습니다.
작동 방식에 대한 간략한 개요는 다음과 같습니다.
- 사용자가 로그인하거나 비밀번호를 변경하면 비밀번호가 crypt 또는 passwd 유틸리티로 전달됩니다.
- crypt 또는 passwd 유틸리티는 단방향 암호화 해시 함수를 사용하여 입력 비밀번호의 해시 값을 계산합니다. 사용되는 특정 해시 함수는 다양할 수 있지만 일반적으로 SHA-256 또는 SHA-512와 같은 알고리즘을 기반으로 합니다.
- 계산된 해시는
/etc/shadow
해당 사용자의 파일에 저장된 해시와 비교됩니다. 이는 유틸리티에 섀도우 파일을 읽을 수 있는 권한이 필요하다는 것을 의미합니다. - 두 해시가 일치하면 인증이 성공하고 사용자에게 액세스 권한이 부여됩니다.
해싱 및 비밀번호 관리는 일반적으로 다양한 비밀번호 저장 체계 및 해싱 알고리즘과의 유연성과 호환성을 보장하기 위해 사용자 공간 프로그램에 의해 처리됩니다. 커널은 사용자 공간 인증 유틸리티 간의 낮은 수준의 상호 작용과 각 프로세스가 어떤 사용자로 실행되고 있는지 추적하는 역할만 담당합니다.