1. /etc/passwd
- 사용자 계정 정보가 저장된 텍스트 파일

순서=> 사용자 이름 : 비밀번호 자리 : UID : GID(primary group) : comment : 홈 디렉터리 : 기본 쉘

- 현재 cloudbread와 Ubuntu 일반사용자가 있음.
- 계정을 더 생성하고 싶을 때는 sudo adduser 명령을 사용하면 된다.

- 사용자 아이디로 로그인 하는 경우에는 ~$이며, 루트 아이디로 전환하는 경우는 ~#이다.
2. /etc/group
- Linux 시스템에서 그룹 정보를 저장하는 파일
순서 => 그룹이름 : x (암호 자리) : GID : 사용자 목록

- sudo 그룹에 포함된 사용자는 sudo 명령을 통해 root 권한으로 명령을 실행할 수 있다.
3. /etc/shadow
- 전통적으로 사용자 계정 정보는 /etc/passwd에 저장 되었다. 그러나 etc/passwd는 시스템에서 여러 프로세스가 읽을 수 있도록 공개되어야 하는 파일이다.
- 비밀번호를 같은 파일에 두면 모든 사용자가 해시를 읽을 수 있게 되어 보안상 취약하다.
- 따라서 민감한 비밀번호 해시는 읽기 권한을 엄격히 제한한 /etc/shadow로 분리하여 보관한다.
- 해시 문자열 형식 : idsalt$hash
- salt를 사용하는 이유 1) 동일 비밀번호 해시 값이 계정 간에 같아지지 않음
- salt를 사용하는 이유 2) 레인보우테이블과 대량 사전 공격을 무력화 시킴 ( 각 사용자 별로 해시를 다시 계산)

- 1 : username
- 2 : password (idsalt$hashed)
- id 1)MD5 2)3) Blowfish 5)SHA-256 6)SHA-512
- 3: Last password change : 1970년 1월 1월 기준으로 마지막으로 바꾼게 언제인지 (숫자가 높을 수록 안좋음)
- 4 : Minimum : 언제 password 바꿀 수 있는지
- 5 : Maximum : 비밀번호 유효 기간
- 6 : Warn : 비밀번호 만료 기간 시작일
- 특수 값들의 의미
- "*" : 관례적으로 로그인 용도가 아닌 계정 (bin,deamon,sshd)
- ! : 잠겨있는 계정
- !! : 계정은 생성되었지만 아직 비밀번호가 설정되지 않았음을 의미
3. Management of user and group
- sudo adduser <사용자 이름> : 새 일반 사용자를 추가할 때 사용
- su (switch user) : 다른 사용자로 전환할 때 사용
- sudo groupadd <그룹 이름> : 새 그룹 생성할 때 사용
- sudo usermod -a -G <그룹이름> <사용자 이름> : 기존 사용자를 그룹에 추가할 때 사용
4. Linux Commands
1). id

- id 명령어를 사용하면, UID/GID 그리고 현재 포함되어있는 주그룹과 보조 그룹 모두를 확인할 수 있다.
2). ls -l /etc/suders

- /etc/sudoers는 리눅스에서 sudo 명령어의 권한 규칙을 정의하는 파일
- root도 기본적으로 읽기만 가능하며, 직접 쓰기는 못한다
- 그래서 sudo visudo를 사용해서 편집해야 한다.

- /etc/sudoers 파일을 root만 접근 가능하기 때문에, 일반 사용자가 접근하면 permission defined가 뜬다. (sudo 명령어를 사용해야만 함.)

- /etc/sudoers의 파일 내용을 살펴보면 위의 내용을 찾아 볼 수 있는데 이는 sudo 명령어를 통해 모든 명령을 실행할 수 있음을 의미한다.
3). sudo id

- root 권한으로 실행될 때 uid, gid, groups는 모두 0이다
4). ls -l /etc/passwd /etc/shadow /usr/bin/ls /usr/bin/passwd /usr/bin/sudo

- /etc/passwd : 사용자 계정 정보 저장 (UID, GID, 홈, 쉘) ,모두 읽기 가능, root만 쓰기 가능
- /etc/shadow : 비밀번호 해시 저장, root 읽기/쓰기 가능, 일반 사용자 접근 불가
- /usr/bin/ls : 파일 목록 확인 명령, 누구나 실행 가능
- /usr/bin/passwd : 비밀번호 변경 명령, SUID 설정 → 일반 사용자가 root 권한으로 실행 가능
- /usr/bin/sudo : root 권한 명령 실행, SUID 설정 → 일반 사용자가 root 권한 명령 실행 가능

- /etc/shadow는 일반 사용자는 접근 불가하기 때문에 접근하려면 sudo 명령어를 사용해야한다.
5). peintenv


- 현재 세션에서 설정된 모든 환경 변수 출력
- PWD는 현재 작업 디렉토리임 => 터미널에서 현재 위치한 폴더를 의미
- XDG_SESSION_TYPE=tty : 현재 세션 유형 => 텍스트 기반 터미널
- HOME : 현재사용자의 홈 디렉토리
6). echo $PATH

- 실행 파일 검색 경로 확인 => 쉘이 명령어를 실행할 때 이 경로 순서대로 탐색
7). whereis ls

8) ls -l /usr/bin/ls bin/ls

9) ls -i /usr/bin/ls bin/ls

- 아이노드 번호가 같음 -> 같은 실제 파일 (둘은 하드링크로 연결되어 있음) => 둘 중 하나를 수정하면 다른 하나에게도 동일하게 반영
- 심볼릭 링크 : 다른 파일이나 디렉토리를 가리키는 포인터 (아이노드 공유 X)
10) sudo ln /usr/bin/ls
11) sudo su bin

- /etc/passwd에서 bin 계정의 로그인 쉘이 sbin/nologin 또는 /bin/false 등으로 설정되어 있기 때문에 발생
- 로그인 불가 계정은 쉘이 제한되어 있어 전환 불가
5. Root = superuser
- root 계정은 모든 권한을 가진 사용자
- 모든 파일을 읽고 쓰는 등 최대 권한을 가진다
- root는 시스템 내 모든 파일의 소유자 역할을 한다
- ROot의 UID = 0
- UID가 0이면 계정 이름이 무엇이든 Root 권한을 사용할 수 있다. => 여러개의 root 계정을 만들 수 있음
- 일반 사용자는 대부분의 권한이 제한된다.
6. File permissions

- sticky bit는 주로 디렉토리에 설정되는 특수 권한 => 파일 소유자, 디렉토리 소유자 또는 root만 그 디렉토리 내의 파일을 삭제하거나 이름을 바꿀 수 있음

- umask 0002 (others의 쓰기 권한 제거) (0666 - 0002 = 0664)
- umask 0022 (group과 others 쓰기 권한 제거) (0666-0022=0644)
- umask 0077 (owner,group,others 읽기/쓰기/실행 권한 제거) (0666-777) = 권한 없음
7. ACL (Access Control Lists)
- 기존 파일 권한 확장 : 기존의 소유자, 그룹, 기타 사용자 권한 만으로는 세밀한 접근 제어 어려움 => ACL을 사용하면 특정 사용자나 그룹별로 별도의 권한 부여 가능

- 사용 예시
- getfacl <파일명> : 해당 파일의 ACL 확인
- setfacl <옵션 -m , -x> > <u,g>:[r,w,x] <file,directory> : ACL 설정
8. Three methods to handle priviliges
1) setUID programs
- SetUID란 "이 프로그램이 실행될 때, 실행한 사용자 권한이 아니라 파일 소유자 권한(root)로 실행된다는 의미이다.

- 일반 사용자는 /etc/shadow를 직접 수정할 수 없지만, passwd 명령어는 SetUID(root) 속성을 가지고 있어서 실행 시 root 권한으로 동작하므로 비밀번호를 번경할 수 있다.
- SetGID란 프로그램 실행 시 실행한 사용자의 그룹 권한이 아니라, 해당 파일의 그룹 권한으로 실행되는 것이다.

- /etc/shadow 파일은 암호 해시가 저장된 매우 민감한 파일로 일반 사용자는 읽을 수 없다.
- 그러나 chage(change Age)는 사용자가 비밀번호 만료일, 비밀번호 주기 등을 변경할 수 있도록 한다.
- 그래서 chage 프로그램에는 SetGID 권한을 부여하여, 일반 사용자가 실행하더라도 shadow 그룹 권한으로 /etc/shadow를 읽고 수정할 수 있게 한 것이다.
- 일반적으로 파일의 접근 권한 (permission bits)은 9비트로 표현된다. 그러나 실제로는 파일 모드(mode)가 12비트로 구성된다.
- 추가적인 3비트 (4 : setUID, 2: setGID, 1: sticky => 디렉터리 내 파일 삭제 제한 (owner만 가능))

- umask 값이 0022 , 즉 새로 만든 파일의 기본 권한은 666- 022 = 644 이다.
- touch 명령으로 setuid1, setuid2 두 개의 빈 파일을 생성한다. (두 파일 권한 644)
- chmod 4744 setuid1 : 앞의 4는 setuid bit를 의미하고 744는 권한을 의미한다. => 이로 인해 소유자 실행 권한이 s로 바뀐다.
- chmod u+s setuid2는 사용자에게 setuid는 설정됐지만 실행권한은 없다. => 대문자 S인 경우는 실행 불가
2) sudo command
- sudo 명령어는 sudo 그룹에 포함되어 있으면 실행이 가능하다.
- sudo : Super-user Do
- ubuntu에서는 기본적으로 root 계정이 잠겨 있다.
- 그러나 관리권한이 필요한 경우에는 sudo를 통해 root 권한 셀을 얻는 여러 방법이 존재한다.
- 장기적으로 root 셀을 남용하는 것은 권장되지 않으며, 개별 명령에만 sudo를 사용해 최소권한 원칙을 지키는 것이 바람직하다.
- sudo -u <사용자> <명령어> : 현재 사용자가 입력된 사용자의 권한으로 명령어 실행

3) POSIX capabilities
- Linux 커널 2.2 버전부터 슈퍼 유저 (root)가 가지고 있던 모든 권한을 세분화하여 개별 단위(capablilities)로 나누는 개념이 도입 되었다.
- capabilities란 루트 권한을 세분화하여 필요한 권한만 부여할 수 있도록 만든 보안 기능이다.
- 기존 방식 : 전통적으로 Linux에서 커널 기능에 대한 모든 접근 권한은 root 계정으로 실행되는 프로세스에만 부여되었다.
- 주요 Capabilities (man capabilities로 목록 확인 가능)
- CAP_CHOWN : 파일의 UID 소유자 또는 GID 그룹을 제한 없이 변경할 수 있는 권한
- CAP_DAC_OVERRIDE : 파일의 읽기, 쓰기, 실행 권한 검사(DAC)를 우회(bypass) 하여 접근할 수 있는 권한
- CAP_NET_ADMIN : 네트워크 관련 설정 및 관리 작업을 수행할 수 있는 권한
- CAP_SETFCAP : 파일에 capabilities를 직접 부여하거나 수정할 수 있는 권한
- CAP_SETPCAP : 프로세스의 capabilitiy 집합을 설정하거나 변경할 수 이쓴 권한
- CAP_DAC_READ_SEARCH : 읽기 또는 디렉토리 검사에 대한 DAC 권한 검사를 우회하는 권한. 즉 읽기 권한이 없어도 파일 내용을 읽거나, 디렉토리 탐색을 할 수 있음.
- CAP_NET_RAW : RAW 소켓을 생성하고 사용할 수 있는 권한. 즉, IP/TCP/UDP 헤더를 직접 조작하여 패킷을 송수신 할 수 있음.
- CAP_SYS_TIME : 시스템의 날짜와 시간을 설정하거나 변경할 수 있는 권한.
- CAP_NET_BIND_SERVICE : 1024 이하의 포트를 root 권한 없이 열 수 있음.
- Process Capability Sets
- Effective : 실제로 사용 중인 권한
- Permitted : 활성화 가능한 권한 집합
- Ingeritable : 자식 프로세스로 상속 가능한 권한


4) POSIX capabilities실습
- Linux에서 파일의 Capability는 security.capability 확장 속성에 저장되며, 이를 조회/설정하기 위해 getcap, setcap, 또는 C용 라이브러리 libcap을 사용한다. 단, 설정을 변경하려면 CAP_SETFCAP 권한이 필요하다.

- sudo setcap "cap_sys_time =pe" /bin/date 를 함으로써 permitted set과 effective set 권한을 주었다.
- 이후 date 명령어는 일반 사용자로 실행해도 root 없이 시간 변경이 가능하다.
- 리다이렉션 : > 입력 (작성) , < 출력 (읽기)

- bin/bash를 /home/ubuntu/mybash로 복사 => 단순히 bash 실행 파일을 복사한 것 뿐이라 권한은 root 권한이 아니라 일반 사용자 권한 그대로이다.
- /home/ubuntu/mybash 실행 후 /etc/shadow 읽기를 시도하면 permission denied가 된다.
- 단순 복사로는 root 권한을 가진 bash를 만들 수 없음.


- /home/ubuntu/mybash 실행 파일에 CAP_DAC_READ_SEARCH 권한 Effective + Permitted(ep)로 설정 => 이 프로그램이 실행 될 때 일반 권한으로 접근할 수 없는 파일 (/etc/shadow)도 읽기를 수행 할 수 있음.
- getpcaps $$ 현재 쉘의 PID의 권한을 확인 가능
- getpcaps는 실행 중 프로세스의 capablities를 확인
- getcap은 파일 자체의 capabilities를 확인

- 읽을 수 있는 자격만 주기 때문에 만약 쓰기도 원한다면 CAP_DAC_OVERRIDE 사용
5) SUID Bit를 POSIX Capabilities로 대체하기
- 원래 ping 실행 권한 확인

- SUID 비트 설정되어 있음 => 일반 사용자가 ping을 실행해도 일시적으로 root 권한으로 실행

- SUID 비트 제거

- 실행 하면 권한 부족 오류 발생

- /bin/ping은 ICMP(Internet Contol Message Protocol) 패킷을 보내려면 root 권한이나 CAP_NET_RAW Capabilities가 필요하다.
- p 권한만 주는 이유는 프로세스를 실행할 때 자동으로 권한을 사용하지 않고 필요할 때만 effective set으로 올리는 것이 안전함
9. Authentication Methods
- 사용자가 알고 있는 것 : 비밀번호
- 사용자가 소유한 것 : ID 카드, OTP 토큰
- 사용자의 특성/행동 기반 : 지문, 홍채, 음성 패턴
- 다중 인증 : 두 가지 이상의 인증 요소를 조합하여 보안 강화