Quick Reference
ls -l app.sh
chmod +x app.sh
chmod 644 config.json
chmod 755 scripts/deploy.sh
umask
chown app:app data/
chown -R app:app uploads/| 값 | 의미 |
|---|---|
r | 읽기 |
w | 쓰기 |
x | 실행 또는 디렉터리 진입 |
u/g/o | 소유자 / 그룹 / 기타 사용자 |
644 | 소유자 읽기/쓰기, 나머지 읽기 |
755 | 소유자 쓰기 가능, 모두 실행 가능 |
umask | 새 파일·디렉터리에서 기본으로 빼는 권한 |
권한 구조
ls -l의 첫 열은 파일 종류와 권한을 보여 줍니다. -rw-r--r--는 일반 파일이고, 소유자는 읽기/쓰기, 그룹과 기타 사용자는 읽기만 가능하다는 뜻입니다. drwxr-xr-x처럼 맨 앞이 d이면 디렉터리입니다.
ls -l
# -rw-r--r-- 1 app app 1200 May 23 config.json
# drwxr-xr-x 2 app app 4096 May 23 scripts디렉터리에서 x는 실행보다 "진입과 경로 탐색"에 가깝습니다. 디렉터리에 읽기 권한이 있어도 실행 권한이 없으면 내부 파일 경로로 접근하기 어렵습니다. 반대로 디렉터리 탐색 문제는 파일 권한이 아니라 부모 디렉터리 권한에서 막히는 경우가 많습니다.
chmod는 권한을 바꾸고 chown은 소유자를 바꾼다
chmod는 rwx 권한을 바꾸고, chown은 owner와 group을 바꿉니다. 실행 권한이 없는 스크립트에는 chmod +x, 웹 서버나 컨테이너 프로세스가 특정 디렉터리에 써야 할 때는 chown이나 그룹 권한을 검토합니다.
chmod +x scripts/deploy.sh
chown app:app /var/lib/myappmode bit만으로 접근 결과가 끝나지 않을 수 있다
umask는 새 파일·디렉터리를 만들 때 기본 권한에서 제거할 비트를 정합니다. 현재 셸의 umask와 systemd service의 UMask=는 다를 수 있으므로, 프로그램이 만든 파일이 예상보다 닫혀 있거나 열려 있다면 생성 주체의 값을 확인합니다.
umask
getfacl /var/lib/myapp # ACL을 쓰는 시스템에서 추가 규칙 확인setuid/setgid/sticky bit도 일반 rwx와 다른 경계를 만듭니다. setgid directory는 새 파일이 디렉터리 group을 상속하고, sticky directory에서는 파일 소유자·디렉터리 소유자·root만 항목을 지울 수 있습니다. setuid executable은 실행 시 effective UID를 바꾸므로 임의로 설정하지 않습니다. ACL, SELinux/AppArmor 정책, read-only·noexec·nosuid mount option은 mode bit가 허용해도 접근을 추가로 막을 수 있습니다.
선택 기준
| 상황 | 선택 |
|---|---|
| 스크립트를 실행 가능하게 함 | chmod +x <file> |
| 설정 파일 기본 권한 | chmod 644 <file> |
| 실행 파일 또는 디렉터리 기본 권한 | chmod 755 <path> |
| 프로세스 사용자를 기준으로 소유권 변경 | chown user:group <path> |
| 디렉터리 전체 소유권 변경 | chown -R 신중히 사용 |
| 권한 문제 원인 확인 | ls -l, id, 부모 디렉터리 권한 |
| mode가 맞는데 접근 거부 | ACL, 보안 정책, mount option 확인 |
주의할 점
권한 오류를 chmod 777로 해결하면 모든 사용자에게 쓰기 권한을 열 수 있습니다.
먼저 어떤 사용자로 프로세스가 실행되는지, 부모 경로와 ACL·보안 정책이 무엇인지 확인하고 필요한 최소 권한만 부여하십시오.
id
ps -o user,pid,cmd -p <pid>
ls -ld /var/lib/myappchown -R과 chmod -R은 의도하지 않은 하위 파일까지 바꿀 수 있습니다. symbolic link, bind mount, 배포 산출물이 섞인 경로는 재귀 변경 전에 find <path> -maxdepth 2 -ls로 구조를 확인하고, 대상 디렉터리를 넓게 잡지 않습니다.
참고 링크
2 sources