리눅스에서 로그인할 때 비밀번호가 어디에 저장되고, 왜 일반 사용자가 비밀번호를 바꿀 수 있는가

리눅스에 로그인하려면 사용자 ID와 비밀번호를 입력한다. 사용자가 비밀번호를 입력하면, 리눅스는 그 비밀번호를 그대로 비교하지 않는다. 입력된 비밀번호를 해시 함수로 암호화한 뒤, 시스템에 저장된 암호화 값과 비교한다. 두 값이 같으면 로그인이 허용된다. 이때 사용자 정보의 기본 뼈대가 들어 있는 파일이 /etc/passwd다.

/etc/passwd 파일에는 모든 사용자 계정 정보가 한 줄씩 저장되어 있다. 한 줄은 콜론으로 구분된 여러 필드로 이루어져 있고, 각각이 사용자 이름, 비밀번호 위치, 사용자 ID, 그룹 ID, 홈 디렉터리, 기본 쉘 같은 정보를 담고 있다. 중요한 점은 두 번째 필드다. 이 자리에 실제 비밀번호가 들어가는 구조이긴 하지만, 요즘 리눅스에서는 여기에 실제 비밀번호를 두지 않는다. 대신 x라는 표시만 두고, 실제 비밀번호는 /etc/shadow 파일에 따로 저장한다.

이렇게 분리하는 이유는 보안 때문이다. /etc/passwd 파일은 시스템이 정상적으로 동작하기 위해 일반 사용자도 읽을 수 있어야 한다. 반면, 암호화된 비밀번호 정보는 훨씬 민감하므로 /etc/shadow 파일에 따로 두고 root만 접근할 수 있도록 한다. 그래서 /etc/passwdx가 있으면 “비밀번호는 shadow 파일에 있다”는 의미다. pwconv 명령은 비밀번호를 shadow 파일로 옮기는 작업을 하고, pwunconv는 다시 passwd 파일로 되돌리는 작업을 한다.

/etc/shadow 파일에는 실제 암호화된 비밀번호와 함께 비밀번호 정책 정보가 들어 있다. 여기에는 마지막 비밀번호 변경 시점, 최소 사용 기간, 최대 사용 기간, 만료 전 경고 일수, 계정 비활성화 시점 같은 보안 정책 값들이 포함된다. 암호화된 비밀번호 부분에 보이는 $1, $5, $6 같은 값은 어떤 해시 알고리즘을 사용했는지를 나타낸다. 중간에 들어 있는 문자열은 salt 값으로, 같은 비밀번호라도 결과가 다르게 나오도록 만드는 보안 장치다.

여기서 많은 사람이 헷갈리는 부분이 있다. 일반 사용자는 /etc/passwd/etc/shadow 파일을 직접 수정할 권한이 없다. 그런데도 일반 사용자가 passwd 명령을 실행해서 자기 비밀번호를 바꿀 수 있는 이유는 무엇일까. 이 이유가 바로 setuid 권한 때문이다.

비밀번호를 바꿀 때 실행하는 프로그램은 /usr/bin/passwd다. 이 실행 파일의 소유자는 root다. 그리고 이 파일에는 일반적인 실행 권한(x) 말고, 특수 권한인 s가 설정되어 있다. 이 s는 “이 프로그램을 실행하는 동안만큼은, 실행한 사용자가 아니라 파일 소유자의 권한으로 실행하라”는 의미다. 즉, 일반 사용자가 passwd를 실행하면, 그 프로그램은 순간적으로 root 권한으로 실행된다. 그래서 passwd 프로그램이 /etc/shadow 파일을 수정할 수 있는 것이다.

이 구조 덕분에 일반 사용자는 시스템 전체를 건드릴 수 있는 권한은 없지만, 자신의 비밀번호 변경이라는 필요한 작업은 안전하게 수행할 수 있다. root 사용자는 더 강력한 권한을 가지므로 passwd 사용자명 형태로 다른 사용자의 비밀번호도 변경할 수 있다.

정리하면, /etc/passwd는 사용자 계정의 기본 정보 목록이고, 실제 비밀번호는 /etc/shadow에 안전하게 저장된다. 일반 사용자가 비밀번호를 바꿀 수 있는 이유는 passwd 프로그램에 setuid라는 특수 권한이 설정되어 있기 때문이다. 이 구조는 리눅스 보안의 아주 기본적인 설계 철학을 보여주는 대표적인 예다.