본문으로 바로가기

사용자의 패스워드 관리

UNIX/Linux에서의 사용자 관리란 시스템을 이용하는 사용자 계정과 인증을 관리하는 것을 의미한다. 시스템에 등록된 사용자 정보는 passwd 파일을 통해서 관리된다.

 

패스워드 저장 정책에는 passwd(/etc/passwd) 파일 내 계정 정보와 함께 저장하는 '일반 패스워드 정책'과 shadow(/etc/shadow) 파일에 패스워드를 별도로 저장하는 'shadow 패스워드 정책'이 존재한다.

 

과거에는 사용자의 패스워드를 passwd 파일의 두 번째 필드에 저장하였으나, 최근 UNIX/Linux 시스템에서는 shadow 파일에 암호화된 패스워드를 저장하고 root만이 접근할 수 있도록 제한하여 패스워드 보안을 강화하고 있다.

 

/etc/passwd 파일 구조

 

/etc/passwd

passwd 파일은 위와 같이 총 7개의 필드로 구성되어 있으며, 각 필드의 의미는 아래와 같다.

번호 필드명 내용
user_account 사용자 계정명, root 계정은 시스템에 대한 총괄 권한을 가지고 있는 계정으로 공격자의 목표가 될 수 있으므로 원격 접속을 금지하는 것이 보안상 안전하다. 일반적으로 root 계정으로 su(switch user) 명령을 허용하는 계정 그룹을 생성한 후 해당 계정으로 접속 후 root 계정으로 전환하여(su 명령) 사용한다.
user_password 사용자 패스워드, x의 의미는 패스워드를 사용하지 않는다는 것이 아니라 shadow 패스워드 방식을 사용한다는 의미이다.
UID 사용자 ID(User ID), root 계정의 경우 0으로 부여한다. UID는 중복되어 사용될 수 있으며 동일한 UID가 부여된 계정은 계정명이 달라도 동일한 권한을 부여받는다. 따라서 임의로 생성된 계정에 UID가 0으로 부여되어 있다면 root 권한 탈취를 위한 행위로 의심해 보아야 한다.
GID 사용자 기본 그룹ID(Group ID), root 그룹의 경우 0으로 부여한다. GID도 UID와 동일하게 중복되어 부여될 수 있으므로 임의로 생성된 그룹에 GID가 0으로 부여되어 있는지 점검해야 한다.
comment 설명, 사용자 관련 기타 정보로 일반적으로 사용자 ID를 설정한다.
home_directory 홈 디렉터리, 로그인에 성공한 후에 사용자가 위치할 홈 디렉터리로 root 계정은 /root 디렉터리를 사용하며 일반 사용자는 /home 디렉터리 하위에 위치한다.
login_shell 로그인 쉘(shell), Linux의 경우 기본 쉘로 bash shell을 사용하며, 로그인이 불필요한 계정(일반적으로 시스템 및 어플리케이션 계정)에 대해서는 로그인을 금지하는 것이 보안 상 안전하다.

 

※ 사용자 로그인 쉘(⑦번 필드) 점검

로그인이 불필요한 계정에 대해서는 로그인을 금지하도록 설정하여 공격자에 의한 불법적인 시스템 접근에 악용되지 않도록 해야한다.

→ 해당 계정의 로그인 쉘을 /sbin/nologin 또는 /bin/false로 설정한다.

 

/sbin/nologin: FTP, SSH 서비스를 비롯하여 시스템의 로그인이 불가능하다. 또한 홈 디렉터리를 사용할 수 없다.

/bin/false: SSH 접근 및 홈 디렉터리 서비스는 사용이 불가능하지만 FTP 서비스는 사용 가능하다.

 

 

/etc/shadow 파일 구조

패스워드 정보를 평문으로 저장할 경우(passwd 방식) 정보 유출 피해가 발생할 수 있으므로 패스워드를 암호화하여 보호해야 하는데, 이는 shadow 패스워드 방식을 사용하여 /etc/shadow 파일에 암호화된 패스워드가 저장되도록 하고 관리자만이 읽을 수 있도록 제한하여 구현할 수 있다.(일반적으로 shadow 파일은 root만이 read할 수 있도록 기본 접근권한이 설정되어 있다.)

 

shadow 파일에는 계정별로 암호화된 패스워드 정보와 패스워드 에이징(aging) 정보가 저장되어 있다. 패스워드 에이징 정보는 시간의 흐름에 따른 패스워드 관리 정책을 말한다.

 

/etc/shadow

shadow 파일은 위와 같이 총 8개의 필드로 구성되어 있으며, 각 필드의 의미는 아래와 같다.

번호 필드명 내용
user_account 사용자 계정명
encrypted_password 암호화된 패스워드
last_change 마지막으로 패스워드를 변경한 날(1970년 1월 1일 기준으로 지난 일수로 표시)
minlife 패스워드 최소 사용기간 설정으로 패스워드를 마지막으로 변경한 날(last_change) 이후부터 패스워드를 변경할 수 없는 일수를 의미한다. 패스워드 최소 사용기간을 설정하지 않으면 익숙한 패스워드를 재사용할 문제점이 있으므로 1일(혹은 1주)로 설정할 것을 권장한다.
maxlife 패스워드 최대 사용기간 설정으로 패스워드를 마지막으로 변경한 날(last_change) 이후부터 패스워드 만료 일수를 의미한다. 패스워드 최대 사용기간을 설정하지 않으면 패스워드 유출 발생 시 공격자의 계속적인 접근이 가능하므로 90일(12주)로 설정할 것을 권장한다. 
warn 패스워드 만료 이전 경고 일수
inactive
패스워드가 만료된 이후 계정이 잠기기 전까지의 비활성 일수로 해당 비활성 기간 동안 패스워드를 변경하지 않으면 계정이 잠기게 된다. Unix 계열에서는 마지막 로그인 이후 해당 비활성 일수 동안 로그인을 하지 않으면 계정을 잠근다는 의미로 Linux와 차이가 있다.
expires 계정 만료일 설정으로 1970년 1월 1일을 기준으로 일수로 표시한다.

 

※ encrypted_password(②번 필드) 구성

 

encrypted_password 필드는 $ID$Salt$encrypted_password 형식으로 되어있다.

ex) $1$1Tyc0bAE$CGxLH0klyFWnzMvAHFLFZ

 

ID는 암호화에 적용된 일방향 해시 알고리즘을 식별하기 위한 ID로 1:MD5, 2:Blowfish, 5:SHA-256, 6:SHA-512를 의미한다. 최근에는 MD5 알고리즘이 더 이상 안전하지 않기 때문에 SHA-256 이상의 해시 알고리즘이 권장된다.

 

솔트(Salt)는 패스워드 암호화 강도를 높이기 위한 임의의(랜덤) 값으로(일종의 첨가물) 사용자가 지정한 패스워드에 서로 다른 솔트를 추가하여 암호화된 패스워드(해시값)를 생성한다. 동일한 패스워드를 사용하더라도 서로 다른 솔트값에 의해 실제 암호화된 패스워드(해시값)는 서로 다르게 생성된다.

 

encrypted_password는 사용자 패스워드에 솔트를 조합하여 해시한 해시값, 즉 암호화된 패스워드를 의미한다.

 

 

정리

1. UNIX/Linux 패스워드 정책에는 /etc/passwd와 /etc/shadow 2가지 정책이 존재한다.

2. passwd 파일의 로그인 쉘을 점검하여 로그인이 불필요한 계정에 대한 접근권한을 설정해야 한다. 

3. shadow 파일은 암호화된 패스워드를 가지고 있어 보안 상 shadow 정책을 사용하는 것이 안전하다.