본문으로 건너뛰기
홈
기술
기술 전체
프로그래밍68
컴퓨터 과학63
AI48
웹 개발36
인프라33
데이터31
소프트웨어 공학18
소개
← 목록으로인프라 › 운영체제 › Linux

[Linux] 리눅스파일관리, 소유권 변경

목차

리눅스 파일관리

파일 정보 확인하기

사용형식

$ 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 파일 속성, 권한 설정.

같은 카테고리의 글