backend

리눅스 권한 (Linux permission) 정리: chown, chmod

seul chan 2020. 12. 15. 00:43

09. Permission

user account는 /etc/passwd에, group은 /etc/group에 정의되어 있고 유저나 그룹이 생성되면 etc/shadow가 수정된다.

root@e78e6ae9e14a:~# > foo.txt
root@e78e6ae9e14a:~# ls -l foo.txt
-rw-r--r-- 1 root root 0 Nov 28 16:02 foo.txt

앞의 10 문자는 file attribute를 나타낸다. 첫번째 문자는 파일타입.

  • -: regular file
  • d: directory
  • l: symbolic link. 이 경우 나머지 값은 rwxrwxrwx (dummy 값이다)
  • c: terminal이나 /dev/null같은 character special file
  • b: block special file (HDD, DVD 드라이브 등)

나머지 9자리는 file mode. owner, group, world(전역)의 read, write, execute 권한을 나타냄.

파일인지 디렉토리인지에 따라 조금씩 내용이 달라짐.

  • r
    • file: open, read
    • directory: 파일 list 가능 (execute가 셋업되어 있어야됨)
  • w
    • file: written or truncated; 다만 파일의 제거나 이름 변경은 directory 속성을 따름
    • directory: 디렉토리 하위의 파일의 생성, 제거, 이름변경 (execute가 셋업되어 있어야됨)
  • w
    • file: 실행가능
    • directory: 해당 디렉토리에 접근 가능 (ex. cd directory)

파일 모드 변경은 chmod 명령어로 가능. (owner나 superuser만 가능하다)

두가지 방법을 지원하는데

  • Octal number representation
  • Symbolic representation

Octal

octal (8진법), hexadecimal (16진법)이 많이 사용되는 이유는 컴퓨터가 binairy(2진법)으로 작동하기 때문. hex color처럼 16진법이 더 많이 사용되지만 8진법이 3 bit binary를 표현하기에 좋기 때문에 8진법이 사용됨

| ocatl | binary | file mode |
| 0 | 000 | --- |
| 1 | 001 | --x |
| 2 | 010 | -w- |
| 3 | 011 | -wx |
| 4 | 100 | r-- |
| 5 | 101 | r-x |
| 6 | 110 | rw- |
| 7 | 111 | rwx |

root@e78e6ae9e14a:~# ls -l foo.txt
-rw-r--r-- 1 root root 0 Nov 28 16:02 foo.txt
root@e78e6ae9e14a:~# chmod 600 foo.txt
root@e78e6ae9e14a:~# ls -l foo.txt
-rw------- 1 root root 0 Nov 28 16:02 foo.txt

주로 사용되는 항목들은 다음과 같음

  • 7 (rwx)
  • 6 (rx-)
  • 5 (r-x)
  • 4 (r--)
  • 0 (---)

Symbolic

symbolic notation은 세가지 파트로 나뉜다.

  • 변경이 어디에 적용될 것인지: u (user), g(group), o(others=world), a(all)
  • Which operation will be performed: + (추가), -(제거), =(해당 항목만 추가 후 나머지 모두 제거)
  • What permission will be set: r, w, x

다음은 몇몇 예시

  • u+x: user(u) 에게 execute (x) 권한 추가 (+)
  • +x: a+x와 동일. 모두에게 execute 권한 추가
  • go=rw: group, other(world)에게 r, w 권한 추가. 나머지 권한 (execute)이 있었다면 제거
  • u+x,go=rw

umask

umask는 default permission을 조정해줌.

root@e78e6ae9e14a:~# umask
0002
root@e78e6ae9e14a:~# > foo.txt
root@e78e6ae9e14a:~# ls -l foo.txt
-rw-rw-r-- 1 root root 0 Nov 29 10:17 foo.txt

보통 0002, 0022가 default value.

root@e78e6ae9e14a:~# rm foo.txt
root@e78e6ae9e14a:~# umask 0000
root@e78e6ae9e14a:~# > foo.txt
root@e78e6ae9e14a:~# ls -l foo.txt
-rw-rw-rw- 1 root root 0 Nov 29 10:17 foo.txt

mask를 0000로 변경하면 모두 rw로 변경된 것을 볼 수 있다.

1로 셋팅되면 mask가 없어지는 것. 아래 표를 보면 world의 기본 모드는 rw-인데 0002의 마스크의 2의 2진법이 010이기 때문에 w가 꺼진다.

| original file mode | --- rw- rw- rw- |
| Mask | 000 000 000 010 |
| result | --- rw- rw- r-- |

0022일 경우에는 world와 마찬가지로 group의 w모드도 꺼진다.

| original file mode | --- rw- rw- rw- |
| Mask | 000 000 010 010 |
| result | --- rw- r-- r-- |

대부분의 경우 umask를 변경할 일은 없고, 특별히 보안을 신경써야 할 때 주로 변경한다.

위의 mask는 3자리수면 충분한데 4자리인 이유는 잘 쓰이지 않는 특수 권한이 사용되기 때문.

  • setuid bit(4000): 실행 가능한 파일에 적용되면 실제로 파일을 실행하는 권한이 프로그램의 owner로 변경된다. 보통 superuser 권한의 프로그램에 사용되어 일반 유저도 해당 프로그램을 superuser 권한으로 실행시킬 수 있게 해줌. 보안 이슈가 생길 수 있어 쵲대한 적게 적용하는게 좋음
  • setgid bit(2000): directory에 적용되면 파일을 만든 group이 아니라 directory의 그룹이 사용된다.
  • sticky bit: 오래된 unix의 잔재. directory에 사용되면 directory의 owner나 superuser가 제외하고는 해당 디렉토리의 파일을 지우거나 이름 변경을 못하게 함. 주로 /tmp같은 shared directory에 적용되어 있음.

각각을 지정하는 방법은 다음과 같음

# setuid
chmod u+s program
# 이렇게 execute에 s가 표시됨
-rwsr-xr-x

# setgid
chmod g+s dir
# 이렇게 directroy execute에 s가 표시됨
drwxrwsr-x

# sticky
chmod +t dir
# world execute에 t가 표시됨
drwxrwxrwt

Changing id

주로 세가지 방법으로 유저 변경.

  • logout 하고 다른 유저로 login
  • su 명령어
  • sudo 명령어

su: Substitute User

새로운 유저로 shell을 시작함.

-l option은 특정 유저의 login shell이 열림. 이는 곧 새로운 유저의 env가 로드되고 새로운 유저의 home 디렉토리로 변경되는 것. (보통 이렇게 사용함)

--l의 축약어이기 때문에 대부분 su -로 사용한다

user가 지정되지 않으면 superuser로 로그인되는데, 그래서 su -가 superuser login임. (su -l root와 같은말)

-c option으로 특정 명령어만 실행시킬 수도 있다.

$ su -c 'less /etc/shadow'
Password:

sudo: Execute a command as another user

sudosu와 비슷하지만 더 중요한 기능들을 포함하고 있음

  • 관리자가 일반 유저들이 sudo로 사용할 수 있는 명령어를 컨트롤 가능하다.
  • sudo 명령어를 사용할 때 superuser의 비밀번호가 필요 없음 (사용중인 해당 유저의 password만 있으면됨)
  • sudosu와 다르게 새로운 shell을 시작하지 않고, 다른 유저의 환경얼 불러오지도 않는다.

chown: change file owner and group

chown [owner][:[group]] file...