목차
리눅스 파일관리
파일 정보 확인하기
사용형식
$ ls [옵션][파일]
[옵션]
-R : 지정한 디렉토리이하에 있는 하부디렉토리와 파일들을 모두 포함한다.(Recursive)
-r : 출력결과를 정열할 때에서 내림차순으로 정렬한다.(Descending)
-S : 파일사이즈가 가장 큰 것부터 순서대로 나열한다.
-l : 파일들을 나열할때 자세히 출력한다.
-a : 경로안의 모든 파일을 나열한다.(숨김파일도 포함)
-h : 파일사이즈를 용량단위(Mb,Gb)를 붙여서 출력해 준다.
-n : 파일의 소유자와 소유그룹을 표기할때 숫자로 UID, GID를 출력한다.
-U : 디스크의 저장순서대로 파일을 나열한다.
-i : 각 파일들의 색인번호(inode)를 각 행의 맨 앞에 출력한다.
-1(숫자1) : 한 줄에 한 파일씩만 나열한다.
-X : 확장자별로 정열하여 나열한다.
-F : 파일의 종류별로 파일의 끝에 특수문자를 표시한다(일반파일: 아무표시없음, 실행파일: *, 디렉토리: /, 심볼릭링크: @, FIFO파일: |, 소켓파일: =)
파일 정보
접근권한 링크 소유자 소유그룹 크기 최종변경날짜시간 이름
drwxr-xr-x 4 gun gun 4096 4월 26 09:40 sample
접근권한에서
-
첫 문자가 d라면 파일 디렉토리를 의미하고 ’-‘라면 일반파일을 의미
-
다음 세 문자는 소유자(user), 소유자가 포함된 그룹(group), 다른 모든 사용자(others)에 대한 읽기(read), 쓰기(write), 실행(execute)권한 유무를 표현
r,w,x, 대신 ’-‘가 표시되어 있다면 읽기,쓰기,실행의 각권한이 없음을 의미
d rwx r-x r-x
디렉토리 소유자 소유그룹 다른 모든 사용자
시스템에 존재하는 다른사용자 권한으로 파일을 생성
$ sudo -u [유저명] touch sample
소유권 변경하기 chown
사용형식
$ chown [옵션][사용자계정 및 그룹][파일]
* 루트계정권한 필요
ex)
$ sudo chown gun sample
ex) ’.’ 또는 ’:‘을 넣어 쇼유자와 그룹을 동시에 변경
$ sudo chown gun:gun sample
접근권한 변경 chmod
사용형식
$ chmod [레퍼런스][연산자][접근권한][파일]
레퍼런스 : 변경할 대상 소유자(user), 그룹(group), 다른 모든사용자(others) 를 뜻하고 차례로 u,g,o 로 표시하고 a(all)은 소유자와 그룹, 다른 모든 사용자 모두를 의미함
연산자 : 권한을 부여하는 연산자는 ’+’ 권한을 해제하는 연산자는 ’-’
접근권한 : r, w, x,로 표시
ex) 시스템의 모든 사용자에게 읽기·쓰기·실행을 허용할 때
$ chmod ugo+rwx sample
ex) 다른 모든 사용자의 읽기·쓰기·실행 권한을 해제
$ chmod o-rwx sample
-8 진수의 숫자 표현을 사용하여 권한을 부여할 수 있다.
8진수 | 권한
400 | 소유자 읽기권한
200 | 소유자 쓰기권한
100 | 소유자 실행권한
40 | 그룹 읽기권한
20 | 그룹 쓰기권한
10 | 그룹 실행권한
4 | 기타사용자 읽기권한
2 | 기타사용자 쓰기권한
1 | 기타사용자 실행권한
ex) 소유자, 그룹, 기타사용자 읽기권한만 부여
$ chmod 444 sample
ex) 소유자, 그룹, 기타사용자에게 읽고쓰기 권한 부여
- 400+200 40+20 4 +2 = 666
$ chmod 666 sample
주요 옵션
[-h] 심볼릭 링크 파일 자체의 소유주나 그룹을 변경
[-R] 하위 디렉토리와 디렉토리 하위의 모든 파일 소유주를 변경
실제 장애에서 권한을 추적하는 순서
서비스가 파일을 읽지 못할 때 바로 chmod 777을 적용하면 원인을 가리고 다른 사용자에게 쓰기 권한까지 준다. 먼저 어느 프로세스가 어떤 사용자·그룹으로 실행되는지, 대상 파일과 상위 디렉터리는 누구 소유인지 확인해야 한다. Linux의 기본 접근 판단은 소유 사용자, 소유 그룹, 그 밖의 사용자 권한을 사용한다. ACL과 SELinux/AppArmor 같은 추가 통제가 있으면 이 비트만으로 결과를 설명할 수 없다.
id
ls -ld /srv /srv/app
ls -l /srv/app/report.txt
namei -l /srv/app/report.txt
namei -l은 /srv/app/report.txt의 각 경로 성분을 풀어 보여 준다. 예를 들어 파일 자체에 그룹 읽기 권한이 있어도 /srv/app 디렉터리에 그룹의 x 권한이 없으면 그 경로를 통과하지 못한다. 파일의 x는 실행이지만 디렉터리의 x는 경로 통과와 이름 검색이다. 디렉터리의 r은 그 안의 이름 목록을 읽는 권한이므로 둘은 서로 다르다.
$ ls -ld /srv/app /srv/app/report.txt
drwxr-x--- 2 deploy app 4096 Apr 26 09:40 /srv/app
-rw-r----- 1 deploy app 128 Apr 26 09:41 /srv/app/report.txt
여기서 파일의 소유자 deploy는 읽고 쓸 수 있으며 app 그룹은 읽을 수 있다. 그 밖의 사용자는 파일도 읽지 못하고 디렉터리도 통과할 수 없다. 실제 서비스 계정이 app 그룹에 속하는지는 id 서비스계정으로 확인한다. sudo -u 서비스계정 test -r /srv/app/report.txt는 해당 계정에서 읽기가 허용되는지 빠르게 검사한다. 다만 이 테스트가 성공해도 애플리케이션 내부 경로, 파일 잠금 또는 다른 보안 정책 때문에 실제 요청이 실패할 수 있다.
flowchart LR A[프로세스의 UID·그룹 확인] --> B[상위 디렉터리의 통과 권한 확인] B --> C[대상 파일의 권한 확인] C --> D[ACL·보안 정책·마운트 상태 확인]
필요한 범위만 변경하기
chown은 누구의 파일인가를, chmod는 그 파일에 허용되는 동작을 바꾼다. 예를 들어 서비스 계정이 app 그룹에 속하고 읽기만 필요하다면 다음처럼 소유권과 권한을 명시한다.
sudo chown deploy:app /srv/app/report.txt
chmod u=rw,g=r,o= /srv/app/report.txt
ls -l /srv/app/report.txt
u, g, o는 각각 소유자, 그룹, 기타 사용자이고 a는 셋 모두다. +는 추가, -는 제거, =는 지정한 권한으로 교체한다. 위 chmod는 숫자로 640과 같다. 숫자 권한은 각 범주마다 r=4, w=2, x=1을 더한다. 750은 소유자가 rwx, 그룹이 r-x, 기타 사용자가 아무 권한도 없음을 뜻한다. chmod 666은 모든 사용자에게 쓰기까지 허용하므로 서비스 오류의 일반적인 해결책이 아니다. chmod 444 역시 모든 사용자에게 읽기를 허용한다.
| 작업 | 명령 예 | 확인할 영향 |
|---|---|---|
| 소유자만 변경 | sudo chown deploy file | 기존 그룹은 유지된다. |
| 소유자와 그룹 변경 | sudo chown deploy:app file | 서비스 계정의 그룹을 확인한다. |
| 그룹 쓰기 추가 | chmod g+w file | 같은 그룹의 다른 사용자도 쓸 수 있다. |
| 공개 접근 제거 | chmod o-rwx file | 공개 읽기가 필요했다면 실패한다. |
chown -R이나 chmod -R은 하위 파일까지 바꾼다. 특히 디렉터리와 파일에 똑같이 644를 재귀 적용하면 디렉터리의 x가 사라져 하위 파일에 접근하지 못한다. 변경 전에는 find /srv/app -maxdepth 2 -ls처럼 대상 범위를 출력한다. 디렉터리와 일반 파일에 서로 다른 권한이 필요하면 find ... -type d와 find ... -type f로 대상을 나눠 검토한다. 링크 자체와 링크가 가리키는 파일은 다른 객체이므로 심볼릭 링크가 포함된 재귀 변경에서는 동작을 먼저 확인해야 한다.
기본 모드 비트가 맞는데도 거부되면 getfacl로 ACL을 확인한다. ls -l의 권한 문자열 끝에 +가 있다면 ACL이 설정됐을 수 있다. 마운트가 읽기 전용인지, 보안 모듈이 거부했는지, 서비스가 예상 계정으로 실행되는지도 확인한다. 원인을 좁힌 뒤 최소한의 경로와 권한만 수정하고 같은 계정에서 재검사한다.
참고: GNU Coreutils 파일 속성, 권한 설정.