! 본 내용은 검토 전 포스트 입니다. 부정확한 내용이 있을 수 있으니 양해바랍니다.
1. 권한
권한(permission)은 보안을 위해 어떤 행위자가 어떤 행위를 할 수 있는지 제한하는 것이다. daehun 유저가 작성한 텍스트 파일은 daehun 유저만 읽을 수 있게 허가하고, 나머지 유저는 못 읽게 하는 것이 그 예이다.
1.1. 권한의 종류
행위 : 읽기(read), 쓰기(write), 실행(execute)
행위자 : root, user, group, other/guest
! root 계정은 소유주/소유 그룹이 아니더라도 모든 파일에 대해서 접근이 가능하다.
2. ls -l
ls -l 명령어를 입력하면 아래와 같이 나옴
주황색 : 권한 → 3개씩 끊어서 묶음으로 나타낼 수 있음 rwx/rwx/rwx
-
- r(read), w(write), x(execute), -(none)
- 첫번째 묶음 : user
- 두번째 묶음 : group
- 세번째 묶음 : others
- r w x / r - x / - - - → user는 r,w,x 가능 / group은 r, x 가능
- 빨간색 : 소유 user
- 파란색 : 소유 group
2.2. group
user가 사용자 본인인것은 알겠는데 group은 뭘까? 현재 내 group은 groups
명령어를 통해 확인할 수 있다.groupadd 명령어 등을 통해 그룹에 참가할 수 있지만, 기본적으로 user명의 group에 자동으로 속해있다.
3. chmod
리눅스에서 권한을 바꾸는 대표적인 명령어.
chmod
명령어는 해당 파일에 대한 소유주와 root만 실행 가능하다 → group도 되는지
// chmod [옵션] [파일/디렉토리명]
chmod 777 /etc/passwd
3.1. 8진수로 권한 나타내기
user/group/other 권한을 따로 분리하여 r=4, w=2, x=1를 매칭시켜 해당하는 권한의 값을 더하고 그 값을 나열한다.
예시 : rwx/r-x/--- → 4+2+1/4+1/0 → 750
chmod 750 /etc/passwd
3.2. 문자로 권한 나타내기
3.3. 권한 실습
- 디렉토리에 접근하기 위해 어떤 권한이 필요할까?
cd /home/test/linux
4. 특수 권한
4.1. ID의 종류
uid(Real UID) : 실제 사용자 본인의 아이디
euid(Effective UID) : 프로그램이 실행될 때 갖는 아이디
내 아이디는 id
명령어를 통해 확인 가능
4.2. 특수 권한의 종류
- setuid : 소유자의 권한으로 프로그램 실행
- setgid : 소유 그룹의 권한으로 프로그램 실행
- sticky bit : 디렉토리에 적용되면 공유 디렉토리 역할을 하며, 디렉토리 소유자 또는 root가 아닌 유저들은 파일을 삭제하고나 이름을 변경 못하게 막음, 파일 또는 디렉토리 생성은 누구나 가능
4.3. 특수 권한 설정 방법
rwx/rwx/rwx를 각각 4/2/1로 나누어 더한 후 chmod 를 통해 설정
기본 755 권한과 더불어 setuid를 주려면 4를 앞에 붙여준다.
chmod 4755 [filename]
만약 setuid는 있지만 x권한이 없으면 대문자 S로 표시되게 된다.
출처 : https://reakwon.tistory.com/189
4.4. 특수 권한 실습
root만 읽을 수 있는 secret.txt 파일을 setuid를 통해 읽는 방법을 학습해보겠다.
파일 생성
echo "SECRET" > /home/test/secret.txt
chmod 600 /home/test/secret.txt
read 프로그램 생성
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
int main(){
int fd=open("root_read_only.txt",O_RDONLY);
int n;
char buf[128];
printf("uid:%d\n",getuid()); //실제 사용자 ID
printf("euid:%d\n",geteuid()); //이 프로그램을 실행할때만 갖는 ID
n=read(fd,buf,sizeof(buf));
if(n<0){
printf("파일을읽을 수 없습니다. erorr code:%d\n",n);
exit(1);
}
printf("file content:%s\n",buf);
}
gcc -o /home/test/setuid /home/test/setuid.c
chmod 4755 /home/test/setuid
5. 소유자 변경
chown(change owner) 명령어를 통해 소유 user와 소유 group을 변경할 수 있다.
chown 명령어는 소유 user와 root만 가능하다.
chown [user]:[group] [filename]
만약 디렉토리 내부의 모든 소유주를 변경해야하면 아래와 같이 -R
(recursive) 옵션을 사용할 수 있다.
chown -R [user]:[group] [filename]
6. 사용자 변경
su(switch user) 명령어를 통해 사용자 변경이 가능하다. user가 root가 아니라면 비밀번호를 입력해야 변경 가능하다.
만약 username을 작성해주지 않으면 root를 적어주지 않아도 root로 사용자 변경을 시도한다.
su [username]
su
명령어 후 pwd
명령어를 입력하면 사용자 변경을 시도한 경로로 사용자가 변경되게 된다. A의 홈 디렉토리에서 su
명령어로 B로 변경후 ls
를 입력하면 권한 문제가 생기게된다. 이는 현재 B가 A의 홈디렉토리에 있기 때문이다. 따라서 - 옵션을 붙여주면 자동으로 변경될 사용자의 홈 디렉토리 경로로 이동되게 된다.
su - [username]
7. sudo
sudo(Substitue User Do)는 일반 사용자가 root 계정으로 명령을 실행 할 수 있는 것이다. 따라서 sudo touch 123
명령어를 입력하면 root권한으로 파일이 생성되게 된다.
/etc/sudoers 설정파일에 있는 user만 sudo 권한을 가질 수 있음
'초보 해커를 위한 C언어와 동작 원리 > Ch3. Operating system' 카테고리의 다른 글
메모리 구조 (0) | 2025.04.23 |
---|