리눅스는 윈도우와 달리 여러 명의 사용자가 각각의 계정(ID)으로 로그인하여 리눅스 시스템을 동시에 이용할 수 있다. 그럼 OS는 어떻게 사용자들을 구분할까? 이에 대해 알아보도록 하겠다.
User - 실제 시스템을 사용하는 사람과 연결된 계정
UID(User ID) - 리눅스에서 사용자 구분시 사용하는 번호
Group - 공통 목적을 가진 사용자들의 집합으로 파일의 권한을 공유, 기본그룹과 보조 그룹으로 구성된다.
GID(Group ID) - 리눅스에서 그룹을 구분하기 위해 사용하는 고유의 번호
리눅스에선 사용자와 그룹의 정보를 4개의 파일에서 저장하고 있다. 하나씩 알아보자
| 파일 | 설명 |
|---|---|
| /etc/passwd | 시스템에 등록된 사용자 정정보 |
| /etc/shadow | 시스템에 등록된 사용자의 패스워드와 패스워드에 대한 설정 |
| /etc/group | 시스템에 등록된 그룹 정보 |
| /etc/gshadow | 시스템에 등록된 그룹의 패스워드와 패스워드에 대한 설정 |
시스템에 등록된 사용자 정보를 저장한다.
/etc/passwd 파일은 총 7개의 필드로 구성되며 각 필드는 : 으로 구분된다.
USER : x : UID : GID : GECOS : HOME : SHELL

| 필드 | 설명 |
|---|---|
| USER | 사용자 이름, 중복 X, 로인 시 이용 |
| x(place holder) | 패스워드 저장 필드이나 현재는 사용하지 않으며 /etc/shadow에 해쉬값으로 저장됨 |
| UID | 시스템에서 사용자 식별에 이용하는 번호 |
| GID | 시스템에서 그룹 식별에 사용하는 번호 |
| GECOS | 주석 필드 |
| HOME | 사용자 홈 디렉토리 절대 경로 |
| SHELL | 사용자가 기본으로 사용할 쉘 |
※ UID/GID 0번은 root 사용자/그룹을 의미하며 1000번 미만은 시스템 사용자 계정/그룹으로 예약되어 있고 일반 사용자/그룹은 1000번 이상부터 부여된다.
기본적으로 생성된 주요 사용자
| 사용자명 | UID | 설명 |
|---|---|---|
| root | 0 | 시스템 관리자 계정 |
| bin | 1 | 시스템에 구동중인 바이너리 파일 관리를 위한 계정 |
| daemon | 2 | 백그라운드 프로세스 제어를 위한 계정 |
| adm | 3 | 시스템 관리를 위한 계정 ex) 시스템 로깅 |
| lp | 4 | 로컬 프린트를 위한 데몬 계정 |
| nobody | 99 | 익명 연결 계정 |
| ntp | 38 | 시간 동기화를 위한 계정 |
| gdm | 42 | 그래픽 화면 관리 계정 |
사용자 패스워드를 해시값으로 저장하고 패스워드에 대한 속성을 저장한다.
해시 알고리즘은 MD-5, SHA-256, SHA-512 등등 리눅스 버전마다 다르다.
/etc/shadow 파일은 총 9개의 필드로 구성되며 :으로 각 필드를 구분한다.
USER : HASH : LASTCHANGE : MIN : MAX : WARNING : INACTIVE : EXPIRE : BLANK

| 필드 | 설명 |
|---|---|
| USER | 사용자 이름 |
| HASH | 해시 알고리즘을 이용해 생성된 해시 값 |
| LASTCHANGE | 마지막으로 비밀번호 변경한 날짜 |
| MIN | 패스워드 변경 후 최소 사용 기간 |
| MAX | 패스워드 변경 후 최대 사용 기간 |
| WARNING | 만료일 전 경고 메시지 출력 여부 |
| INACTIVE | 패스워드 만료 후 지정된 기간 변경하지 않으면 계정이 잠김 |
| EXPIRE | 사용자 계정 만료일 설정 |
| BLANK | 예약된 필드 |
※ HASH 필드의 경우 $로 구분되는 3가지 세부 필드로 나뉘며
해시 알고리즘 유형$slat 값$해시값 으로 구성된다.
그룹에 대한 정보를 저장한다. 만약 사용자의 그룹 정보를 확인하고자 한다면 id 사용자명 을 통해 확인할 수 있다.

/etc/group 파일은 4개의 필드로 구성되며 :을 통해 구분된다.
GROUP : x : GID : MEMBER
| 필드 | 설명 |
|---|---|
| GROUP | 그룹의 이름을 나타내며 유일한 값 |
| x | 그룹 패스워드 저장 필드였으나 현재는 /etc/gshadow에 저장 |
| GID | 시스템에서 그룹을 식별할떄 사용하는 번호 |
| MEMBER | 이 그룹을 보조 그룹으로 지정하고 있는 사용자 목록 |
그룹 로그인 시 사용할 패스워드의 해시값을 저장한다. /etc/shadow와 group 버전!
일반적으로 그룹 패스워드는 거의 사용하지 않는다.
/etc/group 파일은 4개의 필드로 구성되며 :을 통해 구분된다.
GROUP : PASSWORD : ADMIN : MEMBER
| 필드 | 설명 |
|---|---|
| GROUP | 그룹의 이름을 나타내며 유일한 값 |
| PASSWORD | 그룹 패스워드 해시값 |
| ADMIN | 그룹의 관리자 |
| MEMBER | 그룹의 멤버 |
사용자 생성
useradd [option] user-name

useradd를 통해 새로운 사용자 wiker 를 추가하자 /etc/passwd, /etc/shadow에 wiker의 정보가 추가된 것을 확인 할 수 있다.
/etc/shadow에 패스워드 해시값이 없는 것을 확인 할 수 있는데 useradd로 사용자 생성 시 비밀번호가 기본적으로 주어지지 않아 추가로 설정해 줘야 한다.

passwd 사용자를 통해 해당 계정의 비밀번호를 설정해주면 정상적으로 /etc/passwd에 비밀번호 해시값이 생긴 것을 확인할 수 있다.
사용자 정보 수정
usermod [option] user-name

-G 를 통해 보조 그룹을 추가해 줄 수 있다. 보조 그룹을 더 추가 할 시에는 -aG옵션을 사용하자.
사용자 삭제
userdel [option] user-name

사용자를 삭제할 떄는 -r 옵션을 붙여주자. 해당 옵션이 없으면 사용자가 삭제되도 생성된 홈 디렉토리가 그대로 남아있다.
groupadd [option] group-name

-g 옵션을 통해 그룹 생성 시 GID를 지정해 줄 수 있다.
groupmod [option] group-name

-g 옵션을 통해 GID를 -n 옵션을 통해 그룹명을 수정할 수 있다.
groupdel [option] group-name

su [-] user-name
su를 이용하면 다른 사용자로 전환할 수 있다.

인자값을 붙이지 않으면 관리자 계정으로 전환을 의미하며 계정 전환 시 전환하는 계정의 비밀번호를 입력해야 한다. 단 관리자 계정에서 일반계정으로 전환 시 비밀번호 입력이 생략된다.
- 옵션의 경우 전환 시 전환하는 계정의 환경변수가 적용되고 홈 디렉토리로 이동한다.
sudo 를 붙인다.
캡처 이미지에선 안나오지만 sudo 사용 시 비밀번호를 입력해야 하는데 이 비밀번호는 root 비밀번호가 아니라 기존 사용자의 비밀번호이다.
모든 일반사용자가 sudo로 root 권한으로 명령이 실행가능하다면 보안상 매우 취약할 것이다. 따라서 sudo를 사용하기 위해선 조건이 필요하다.
/etc/sudoers 에 등록이 둘 중 하나에 속해야 sudo를 사용할 수 있다.

알고리즘 종류
DES(0), MD5(1), SHA-256(5), SHA-512(6) 등등이 있는데 리눅스 버전마다 다르다.
SALT란?
해시 알고리즘을 통해 해시값을 생성할떄 보안성 강화를 위해 원문에 랜덤한 값을 삽입하는데 이 랜덤한 값을 SALT라고 한다.
같은 비밀번호라도 SALT가 다르면 전혀 다른 해시가 생성된다.
속성 변경
chage [option] [argument] user-name

/etc/shadow 필드 중 USER, HASH를 제외한 필드의 값을 chage 를 통해 변경할 수 있다.
| 옵션 | 설명 |
|---|---|
| -l(소문자 L) | 사용자 패스워드 속성 확인 |
| -d | 마지막으로 변경한 날짜 수정 만약 0이 설정되면 다음 로그인 시 강제로 패스워드 변경해야 됨 |
| -m | 패스워드 변경 할 수 있는 최소 기간 수정 |
| -M | 패스워드 사용 할 수 있는 최대 기간 수정 |
| -W | 패스워드 유효기간 마료 전 경고하는 날짜 지정 |
| -I(대문자 i) | 패스워드 만료 후 추가 시간을 주어 변변경할 수 있는 날짜 수정 |
| -E | 만료 날짜를 특정 날짜로 지정 |

실행권한이 있는 바이너리/스크립트 파일에 사용한다.
setuid가 설정되어 있으면 파일 실행 시 실행한 사용자가 아니라 파일을 소유하고 있는 사용자의 권한으로 프로세스를 실행한다.

만약 setuid 가 설정되어 있다면 실행권한을 나타내는 x가 s로 표시된다.
만약 실행권한이 설정되지 않은채 setuid를 설정 시 S로 표시된다.
바이너리/스크립트 파일에 설정되어 있으면 실행 시 프로세스의 사용자 그룹이 파일의 사용자 그룹으로 실행된다.
일반적으론 디렉토리에 설정하여 사용한다.
setgid가 설정된 디렉토리에 파일을 생성하면 파일의 사용자 그룹은 파일을 생성한 사용자가 아닌 디렉토리의 사용자 그룹으로 상속된다.

setuid와 비슷하게 setgid 가 설정되어 있다면 실행권한을 나타내는 x가 s로 표시된다.
만약 실행권한이 설정되지 않은채 setuid를 설정 시 S로 표시된다.
디렉토리에 기타 사용자 권한의 rwx 권한이 모두 설정되어 있다면 모든 사용자는 파일을 자유롭게 생성하고 삭제할 수 있을 것이다.
이때, 다른 사용자가 생성한 파일을 삭제하는 것은 문제가 될 수 있다. sticky bit는 본인이 소유한 파일만 삭제할 수 있도록 한다.

sticky bit가 설정되어 있다면 실행권한을 나타내는 x가 t로 표시된다.
만약 실행권한이 설정되지 않은채 sticky bit를 설정 시 T로 표시된다.
chmod를 통해 확장권한을 설정할 수 있다. 사용 방법은 rwx 권한 설정과 유사하다.
setuid, setgid는 s
sticky bit는 t를 사용한다.
ex) u+x g+x o+t
setuid는 4000, setgid는 2000, sticky bit는 1000 을 이용해 권한을 부여할 수 있다.
ex) chmod 4777 FILE, chmod 2777 FILE, chmod 1777 FILE
심볼릭 방식으로 쓰는게 편한 것 같다.
※ 참고 자료
엔터프라이즈 리눅스 핵심 운영 가이드 vol.1
https://www.stratosphereips.org/blog/2020/10/22/a-visual-display-of-etcpasswd-andetcshadow
http://yesxyz.kr/about-on-encrypt-and-salt-of-password/