whoami # kim
id # uid=1001(kim) gid=1001(kim) groups=1001(kim),10(wheel)
groups # kim wheelid 한 줄에 내 사용자 번호, 기본 그룹, 속한 그룹 전부가 나옵니다. 권한 문제가 생기면 이것과 파일의 소유자·그룹을 비교하는 것이 첫 단계입니다.
ls -l 의 첫 열은 종류 1글자와 권한 9글자입니다. 9글자는 3글자씩 소유자, 그룹, 기타 순서입니다.
-rw-r--r-- 1 myapp myapp app.jar
drwxr-x--- 2 myapp myapp conf
↑ ↑↑↑ ↑↑↑ ↑↑↑
종류 소유자 그룹 기타| 글자 | 파일에서 | 폴더에서 |
|---|---|---|
| r | 내용 읽기 | 이름 목록 보기 |
| w | 내용 쓰기 | 파일 만들기·지우기 |
| x | 실행 | 들어가기(cd)·안 파일 접근 |
첫 글자는 - 파일, d 폴더, l 링크입니다. 폴더는 x 가 없으면 r 이 있어도 안의 파일을 열 수 없습니다.
r=4, w=2, x=1 을 더한 숫자 세 자리가 권한입니다. 외워 두면 ls -l 을 보는 즉시 숫자로 읽힙니다.
| 숫자 | 표기 | 쓰임 |
|---|---|---|
| 644 | rw-r--r-- |
일반 파일 |
| 600 | rw------- |
비밀번호·키 |
| 755 | rwxr-xr-x |
폴더·스크립트 |
| 750 | rwxr-x--- |
앱 폴더 |
| 700 | rwx------ |
개인 폴더 |
| 777 | rwxrwxrwx |
쓰지 않음 |
chmod 750 /opt/myapp 이 "소유자 전부, 그룹 읽기·실행, 남은 아무것도" 입니다. 대부분의 운영 폴더가 이 값입니다.
숫자가 전체를 설정한다면 기호는 일부만 더하거나 뺍니다. 대상 u g o a, 동작 + - =, 권한 r w x 를 조합합니다.
chmod u+x deploy.sh # 소유자에게 실행 추가
chmod go-w conf.txt # 그룹·기타 쓰기 제거
chmod a=r readme.txt # 모두 읽기만으로 설정
chmod -R g+w shared/ # 하위 전부 그룹 쓰기스크립트를 만들면 chmod u+x 한 번이 필요합니다. -R 은 폴더 아래 전체에 적용하므로 범위를 확인하고 씁니다.
새 파일과 폴더의 기본 권한은 umask 값을 뺀 결과입니다. 기본 022 이면 파일 644, 폴더 755 입니다.
umask # 0022
umask 077 # 이 셸에서 만드는 파일은 600, 폴더 700서비스 계정의 .bashrc 나 유닛 파일의 UMask= 로 정하면 앱이 만드는 파일이 처음부터 안전한 권한을 갖습니다. 운영 묶음 01 에서 잠깐 본 값입니다.
파일의 소유자와 그룹은 root 만 바꿀 수 있습니다. 배포한 파일을 앱 계정에게 넘길 때 씁니다.
sudo chown myapp:myapp app.jar # 소유자:그룹
sudo chown -R myapp:myapp /opt/myapp # 하위까지
sudo chgrp deploy conf # 그룹만root 로 scp 한 파일은 root 소유라 앱 계정이 못 읽습니다. 배포 스크립트 끝에 chown -R 을 넣어 두는 것이 관례입니다.
| 명령 | 뜻 |
|---|---|
useradd -m -s /bin/bash kim |
홈 폴더와 셸 |
useradd -r -s /sbin/nologin myapp |
서비스 계정 |
passwd kim |
비밀번호 설정 |
usermod -aG wheel kim |
그룹 추가 |
userdel -r kim |
홈까지 삭제 |
-r 은 시스템 계정으로 번호가 1000 미만이고, /sbin/nologin 은 로그인을 막습니다. 앱을 띄우는 계정은 이 형태로 만들어 뚫려도 셸을 못 얻게 합니다.
sudo groupadd deploy # 그룹 만들기
sudo gpasswd -a kim deploy # 넣기
sudo usermod -aG deploy kim # 같은 뜻
getent group deploy # deploy:x:1005:kim,lee그룹 추가는 다시 로그인해야 적용됩니다. usermod -G 에서 -a 를 빼면 기존 그룹이 전부 빠지고 지정한 그룹만 남는 큰 실수가 됩니다.
사용자 정보는 이 두 텍스트 파일에 있고 getent 로 읽습니다.
getent passwd myapp # myapp:x:989:989::/opt/myapp:/sbin/nologin
getent group wheel # wheel:x:10:kimpasswd 한 줄은 이름, 비밀번호 자리, uid, gid, 설명, 홈, 셸 순서입니다. 비밀번호는 /etc/shadow 에 따로 있어 root 만 봅니다.
sudo 명령 이 그 명령만 root 로 실행합니다. 내 비밀번호를 묻고 잠시 기억합니다.
sudo systemctl restart myapp # root 로 한 명령
sudo -u myapp jstack 1234 # 다른 사용자로
sudo -l # 내가 할 수 있는 것
sudo -i # root 셸, 꼭 필요할 때만RHEL 은 wheel 그룹이 sudo 를 쓸 수 있습니다. sudo -u 는 운영 묶음 09 에서 앱 계정으로 jstack 을 붙일 때 쓴 형태입니다.
특정 명령만 허용하려면 visudo 로 /etc/sudoers 를 편집합니다. 문법 오류를 검사해 잠기는 사고를 막습니다.
kim ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart myapp, /usr/bin/systemctl status myapp
%deploy ALL=(myapp) NOPASSWD: /opt/myapp/app.sh첫 줄은 kim 이 두 명령만 비밀번호 없이, 둘째 줄은 deploy 그룹이 myapp 계정으로 배포 스크립트만 실행합니다. 운영자에게 root 셸을 주지 않고 필요한 것만 여는 방식입니다.
세 가지 특수 비트가 있습니다. 폴더의 setgid 와 /tmp 의 sticky 를 알아 두면 됩니다.
| 비트 | 표기 | 뜻 |
|---|---|---|
| setgid 폴더 | drwxrwsr-x |
새 파일이 폴더 그룹을 상속 |
| sticky | drwxrwxrwt |
남의 파일 못 지움 |
| setuid | -rwsr-xr-x |
소유자 권한으로 실행 |
chmod g+s /srv/shared # 팀 공유 폴더
chmod +t /srv/upload # 각자 자기 파일만 삭제passwd 명령이 setuid 로 /etc/shadow 를 고칩니다. 직접 만든 스크립트에는 setuid 를 쓰지 않습니다.