현대의 거의 모든 운영체제는 다중 사용자를 지원한다. 많은 사람들이 사용하는 Windows와 macOS도 여러 명의 사용자를 생성할 수 있으며, 각 사용자에게 적절한 권한을 주어 여러 명의 사용자가 동일한 리소스를 안전하고 적절하게 사용할 수 있도록 한다.
리눅스도 이를 지원하며 모든 파일은 소유자와 그룹, 그리고 권한을 가진다. 이런 값들은 리눅스 파일과 디렉토리 시스템을 학습해보았다면 접해봤을 inode가 저장하고 있다.
리눅스는 **유저(u, user)**와 **그룹(g, group)**을 가진다. 유저는 온라인 사이트의 계정과 유사한 개념이며, 한 유저가 여러 개의 권한을 가질 수 없다. 그룹은 특정한 권한을 가진 사용자의 집단을 표현하기 위한 것이며, 한 유저는 여러 개의 그룹에 속할 수 있다.
유저 정보는 /etc/passwd 에 저장된다. cat /etc/passwd 로 확인해보면 다음과 같은 문자열들을 확인할 수 있다.
[이름]:[암호]:[UID]:[GID]:[추가정보]:[홈 디렉터리]:[기본 셸]
| 정보 | 상태 |
|---|---|
| 이름 | 유저의 이름 |
| 암호 | 사용자의 암호, x인 경우 /etc/shadow 에 따로 암호 저장 |
| UID | 사용자의 id |
| GID | 그룹 id |
| 추가 정보 | 사용자의 추가 정보 저장 |
| 홈 디렉터리 | 사용자의 홈 디렉터리 경로 |
| 기본 셸 | 해당 계정으로 로그인 시 사용할 셸 |
/etc/shadow 는 계정의 암호화 만료 기간 등을 저장한다. root만 cat /etc/shadow 로 읽을 수 있다.
root 계정은 관리자 권한 계정으로 리눅스 운영체제에서 가질 수 있는 최고 권한을 가진다. 운영체제 설정 변경이나 계정 생성, 삭제와 같이 일반 유저들이 수행할 수 없는 작업들을 할 수 있다.
sudo 는 root로 명령어를 실행할 수 있도록 하는 명령어이다.
sudo cat /etc/shadow 로 확인해보면 다음과 같은 문자열들을 확인할 수 있다.
[이름]:[암호화 값]:[수정 일자]:[최소 사용 기간]:[최대 사용 기간]:[경고 기간]:[만기일]:[차단 기간]:[reserved]
| 정보 | 상태 |
|---|---|
| 이름 | 유저의 이름 |
| 암호화 값 | $[id]$[salt]$[hash]의 형태이며 각각 |
| • id: 해싱 알고리즘 | |
| • salt: 해싱 시 salt 값 | |
| • hash: password와 salt를 id에 해당하는 해싱 알고리즘으로 해싱 시 결과 |
* 는 어떤 password도 대응되지 않음 |
| 수정 일자 | 유닉스 시간(1970년 1월 1일) 기준으로 패스워드가 수정된 일자
0이라면 다음 로그인 시 패스워드를 변경해야 한다. |
| 최소 사용 기간 | 패스워드 변경 일자로부터 최소 사용 기간 이후 다시 변경 가능
0이라면 언제든 변경 가능하다 |
| 최대 사용 기간 | 패스워드의 유효 기간
99999라면 만료되지 않음 |
| 경고 기간 | 패스워드 만료 전 사용자에게 미리 경고해주는 기간 |
| 만기일 | 패스워드 사용 기간이 만료된 후 실제로 계정이 사용 불가능하기까지의 기간 |
| 차단 기간 | 유닉스 시간(1970년 1월 1일) 기준으로 패스워드가 만료될(된) 일자 |
| reserved | 아직 사용하지 않음 |
그룹 정보는 /etc/group 에 저장된다. cat /etc/group 로 확인해보면 다음과 같은 문자열들을 확인할 수 있다.
[이름]:[암호]:[GID]:[멤버]
| 정보 | 상태 |
|---|---|
| 이름 | 그룹의 이름 |
| 암호 | 그룹의 암호, x인 경우 /etc/gshadow 에 따로 암호 저장 |
| GID | 그룹 id |
| 멤버 | 해당 그룹에 포함되는 유저 이름들 |
/etc/gshadow 는 그룹 패스워드와 몇 가지 정보를 저장한다. root만 cat /etc/shadow 로 읽을 수 있다.