(리눅스 수업을 들었기 때문에 거의 복습에 가깝다...)
소유권과 허가권
- 파일/디렉터리마다의 접근권한 (=퍼미션, 허가권)
- 권한을 변경할 수 있는 명령어 chmod
명령어 umask
기본권한 - umask로 설정된 권한 = 디폴트 권한
ex umask 002인 경우, 리눅스 시스템에서 파일의 기본권한은 666 디렉터리는 777이다
666 - 002 = 파일 664, 디렉터리 775
$ ll
-rw-rw-r--. 1 linuxadmin linuxadmin 0 4월 13 14:20 a.txt
drwxrwxr-x. 2 linuxadmin linuxadmin 6 4월 13 14:25 aa
| | | | | | | 소유그룹 (/etc/group 참고, 없을시 gid)
| | | | | | 소유자 (/etc/passwd 참고, 없을시 uid)
| | | | | 하드링크 개수
| | | | others 권한
| | | 그룹 권한
| | 소유자 권한
| 파일 유형 (-, l, d, b, c, p, s) -일반파일, l 심볼릭링크, d디렉터리, b블록파일, c문자형장치파일, p파이프, s소켓
chmod
1. 심볼릭 모드 (문자사용, ugo,+-=rwxst)
2. 8진수 모드 (0~7)
ex chmod 777 aa.txt
ex chmod u-x aa.txt / chmod -x aa.txt / chmod +r aa.txt / chmod = aa.txt
user에 - x 권한 user, group, others에 전부 -x user, group, others에 전부 +r 전부 초기화 (000)
ex chmod 4 a.txt
=> 0은 생략가능하므로, 0004라는 뜻. others의 r권한만 있다.
rwx
r조회(4) w수정(2) x실행(1)
단, 특수권한은 표기가 조금 다르다
x권한 설정 | x권한 미설정 | |
set-uid 설정(4000) | rws | rwS |
set-gid 설정(2000) | rws | rwS |
sticky bit 설정(1000) | rwt | rwT |
* 잘못된 설정 : chmod u+S a.txt <- 대문자가 아니라 소문자로 써야함
chmod u+t a.txt <- sticky bit는 others에 설정가능
rwx = 7 rw- = 6 r-x = 5 r-- = 4 -wx = 3 -w- = 2 --x = 1 |
rwx권한은 user, group, others 세 개가 있으므로
rwxrwxrwx = 777 이렇게 표기한다.
특수권한의 경우
rwxrwxrwx는 777이다.
set-uid 설정 → rwsrwxrwx가 되면, 4777 (+4000)
set-gid 설정 → rwsrwsrwx가 되면, 6777 (+2000)
sticky bit 설정 → rwsrwsrwt가 되면, 7777 (+1000)
파일 권한
r은 파일의 내용을 조회
w은 파일의 내용을 수정
x는 파일을 실행
set-uid는 소유자의 권한으로 실행
( set-uid가 설정되어 있고 root소유의 파일에 others x 권한이 있다면, 권한상승 취약점이 발생할 수 있다)
set-gid는 그룹의 권한으로 실행
( set-gid가 설정되어 있고 root그룹소유의 파일에 others x 권한이 있다면, 권한상승 취약점이 발생할 수 있다)
sticky bit X
디렉터리 권한
r은 디렉터리내 파일 목록을 볼 수 있다
w는 디렉터리내 파일 생성/삭제를 할 수 있다
x 디렉터리내로 들어갈 수 있다
set-uid X
set-gid는 그룹의 권한으로 파일을 생성
sticky bit는 공용디렉터리 전용 설정으로, 생성은 누구나 할 수 있지만 수정/삭제는 생성자만 가능. others의 x권한이 같이 있어야 제대로 사용할 수 있다 (x가 없으면 디렉터리로 들어갈 수 없어, 파일을 생성하는 것이 불가능하기 때문)
( centos7 이후로 디렉토리 체계가 조금 달라짐
ls -ld /bin/
dr-xr-xr-x. 2 root root 20480 4월 6 16:21 /bin/
=> /usr/bin 폴더의 내부를 보여준다
ls -ld /bin
lrwxrwxrwx. 1 root root 7 4월 6 14:48 /bin -> usr/bin
=> /bin
디렉터리에 슬래시(/) 유무 차이로 ls -ld 결과가 다른 이유는 심볼릭 링크 때문이다
/bin/은 심볼릭링크 원본인 /usr/bin폴더를 보여준 것이고
/bin은 심볼릭링크가 걸린 폴더 /bin을 보여준 것)
cat /etc/shadow
=> 1. cat 명령어를 실행할 수 있어야 한다. cat 명령어 위치는 /usr/bin/cat 이므로, /usr/bin/ 폴더에 접근 가능 & /usr/bin/cat 파일 실행 권한이 있어야 한다.
=> 2. /etc/shadow는 /etc 폴더에 접근 가능해야 하고, /etc/shadow 파일을 조회할 수 있어야 한다
=> 이 중 하나라도 권한이 충족하지 못하면 허가 거부가 떨어진다.
명령어 위치 확인 : which
실습
1. /usr/bin 디렉터리의 others 권한을 전부 초기화한다 (550)
일반유저는 /usr/bin 디렉터리에 접근하지 못해, cat, ls 등 명령어를 사용하지 못하고 허가 거부된다
2. /usr/bin/cat 파일의 others 권한을 전부 초기화한다 (750)
일반유저는 /usr/bin 디렉터리에 접근할 수 있지만, cat 명령어를 사용하지 못하고 허가 거부된다 (다른 명령어는 사용가능)
3. /etc 디렉터리의 others 권한을 전부 초기화한다 (750)
일반유저는 cat 명령어를 사용하지 못할 수 있지만, /etc 디렉터리에 접근할 수 없어 허가 거부된다
4. cat /etc/shadow
일반유저는 cat 명령어를 사용할 수 있고, /etc 디렉터리에 접근할 수 있지만 /etc/shadow 파일을 조회할 수 없어 허가 거부된다 (같은 디렉터리의 /etc/passwd 파일은 읽을 수 있다)
기밀성 : 인가된 사용자들 외에 노출되지 않도록 보호함
무결성 : 내용이 불법적으로 변조되지 않도록 보호함
가용성 : 정상적으로 사용할 수 있도록 함
set-uid가 설정되어 있을 때
=> 소유자가 root라면, 그 파일을 root의 권한으로 실행한다. (=권한상승)
set-gid가 설정되어 있을 때
=> 소유그룹이 root라면, 그 파일을 root 그룹의 권한으로 실행한다. (=권한상승)
set-uid가 필요한 상황?
=> /etc/shadow 의 소유자는 root 이다
일반 사용자도 비밀번호를 수정할 수 있어야 하기 때문에,
비밀번호를 수정할 때만 passwd(rwsr-xr-x) 명령어의 set-uid인 root의 권한으로 수정됨
소스레벨로 접근해서 setuid 확인하기
C 라이브러리 함수
getgid() gid 가져오기, getegid() egid 가져오기, getuid() uid 가져오기
fopen() 파일 오픈, fgets() 파일에서 내용 읽기, fclose() 파일 닫기
exit() 프로세스 종료, fprintf() 화면 출력, printf() 화면 출력
test.c파일의 내용은
printf("uid = %d\n", getuid());
printf("euid = %d\n", geteuid());
getuid와 geteuid를 출력해주는 것이다
root로 출력시 uid = 0, euid = 0
user1로 출력시 uid = 1000, edid = 1000
그런데, set-uid를 root로 설정한 후 user1로 출력하면 uid=1000, euid=0으로 출력된다
euid는 effective user id로 프로세스를 실행할 권한을 가진 id인데,
파일의 소유자인 root의 권한으로 euid가 설정된다
chown daemon test
소유자를 바꾸고, set-uid를 설정하면,
소유자인 daemon의 권한으로 euid가 설정된다. ( uid=1000, euid=daemon의 uid값 )
파일의 내용 : setuid(geteuid())를 이용해 uid를 root것으로 수정해서 권한상승
=> /etc/shadow에 접근할 수 없었던 일반유저가,
set-uid root로 설정되고 난 뒤에는 /etc/shadow에 접근할 수 있게 되었다.