개인/리눅스

[리눅스] 파일의 특수권한과 링크(하드,심볼릭)

OmeGa2 2020. 2. 4. 18:32

리눅스에서 파일에 대한권한 (소유권과 허가권)

리눅스는 다수의 사용자들이 동시에 접속할 수 있는 운영체제이다. 즉 여러 사용자가 같은 저장공간을 공유하고 내가 만든 디렉터리나 파일을 다른 사용자가 볼 수 있다. 이는 내가만든 파일을 다른사용자가 삭제할 수도 있다는 것을 의미한다.

 

따라서 자기가 만든 파일을 지키기 위해서는 파일에 대한 소유권과 허가권을 이용해야 한다. 허가권은 다른사람이 내 파일을 읽고, 쓰고, 실행하는데에 있어 별도의 권한을 따로 부여해주는 것이다. 다른사용자는 설정된 허가권에 따라 실행할 수는 있지만 읽을 수는 없거나, 수정할 수는 있지만 실행할 수는 없는 경우도 있다.

 

일반적으로 소유권은 말그대로 파일의 소유자를 말하며, 파일의 소유권을 가진 사용자가 허가권을 설정해서 다른사용자가 접근할수 없도록 설정한다. 

 

허가권 설정

▶ ls -l 명령으로 확인 가능

user, group, other 세 가지로 구분

   (rwx ,  rwx ,   rwx)

▶ 다른사용자가 읽고(r), 쓰고(w), 실행(x)할 수 있는 권한 부여

허가권은 총 세 가지 영역으로 나뉜다. 각각의 영역에 따라 권한을 별도로 부여할 수 있으며 권한을 받은 계정만이 파일을 보거나 실행할 수 있다. 해당 권한은 소유권을 가진 계정이 chmod명령을 통해 변경할 수 있으며 권한의 종류는 숫자로 지정할 수 있다. 

 

모든 권한의 11, 22 파일의 사용

11, 22 파일을 ls -al 명령로 확인한다면 해당 파일의 종류와 권한을 볼 수 있다. 참고로 첫번째 필드에서 "-"로 표시된 부분은 일반파일을 의미한다. (-rwxrwxrwx : 일반파일 / drwxrwxrwx : 디렉터리)

 

첫번째 필드(-rwxrwxrwx)를 보면 모든사용자에게 읽기, 쓰기, 실행 권한이 부여된 것을 확인할 수 있다. 이는 모두가 변경할 수 있고 사용할 수 있다는 것을 의미한다. 따라서 다른사용자 other로 계정을 변경해서 해당 파일을 실행했을 때 정상적으로 출력되는 것을 볼 수 있다.

<파일 종류>

-  : 일반파일

d : 디렉터리

l  : 링크파일

s : 소켓

b : 디스크 드라이버

 

 

x(실행)권한이 없는 경우

동일한 파일을 chmod 명령으로 그룹,일반사용자에게 실행권한을 제거했다. (rwxrw-rw-) 따라서 root 계정일 때는 무리없이 11, 22 파일이 정상출력되지만 다른계정(other)으로 같은 파일을 실행할 경우 권한이 없어 실행할 수 없다고 표시된다. 

 

다만 실행(x)권한만 제외했기 때문에 파일을 읽고(r), 쓰는(w)데는 문제가 없다. 실제로 cat이나 vim명령을 통해 해당 파일을 읽고, 쓰는데는 문제가 없는것을 확인할 수 있다.

 

이처럼 허가권은 내가만든파일에 권한을 부여해 다른사용자가 접근할 수 없도록 만드는 기능이다. 

 

 

 

 

 

 

파일이 가지는 특수권한

파일의 소유자가 허가권(rwx)을 설정해 관리하는 리눅스의 파일시스템에서는 여로모로 불편한 점이 생긴다. 프로그램을 사용하다보면 가끔 root권한으로 파일을 사용해야하는 경우가 종종 생긴다. 하지만 그때마다 관리자가 권한을 일일이 변경하는 것은 비효율적이며 불편한 경우가 많다.

 

예를들어 사용자가 passwd 명령으로 자신의 password를 바꾸고 싶은 경우 패스워드가 암호화되어 저장된 /etc/shadow 파일을 이용해야 한다. 하지만 /etc/shadow 파일은 관리자만 사용할 수 있기 때문에 일반사용자는 읽거나 실행할 수 없다. 그럼 일반 사용자는 자신의 비밀번호도 바꿀 수 없는걸까? 이럴 때 특수권한이 필요하다.

 

특수권한의 종류

▶ set-UID : 실행파일에 사용, 파일실행시 관리자권한을 빌린다.

  (-rwsrwxrwx) = user의 실행권한 변경 (x s)

▶ set-GID : 실행파일에 사용, 파일실행시 그룹권한을 빌린다.

  (-rwxrwsrwx) = group의 실행권한 변경 (x → s)

▶ Sticky-bit : 공유디렉터리에 사용

  (-rwxrwxrwt) = other의 실행권한 변경 (x → t)

특수권한은 관리자나 그룹의 권한을 빌려온다는데 의미가 있다. set-UID가 지정된 파일을 사용할 때 실행되는 동안에만 관리자의 권한을 빌려와 사용할 수 있다. 보통 명령어 (su , passwd 등)에 설정해서 사용한다.

 

Sticky-bit의 경우 공유디렉토리에 주로 쓰이는데, 만약 특수권한 없이 root 권한으로 설정된 디렉토리를 공유로 사용한다면 내부의 파일은 모두가 건드릴 수 있다는 문제가 생긴다. 즉 A계정의 파일을 B계정으로도 지울수 있다. 이럴 때 Sticky-bit (rwxrwxrwt) 설정이 된 파일을 공유로 사용할 경우 모든 사용자가 접근할 수 있지만 내부의 파일은 소유권과 허가권에 따라 관리하게 된다.

 

특수권한 설정

권한은 chmod 명령을 사용해서 설정할 수 있으며 각각 파일에 11 = Set-UID / 22 = Set-GID / 33 = Stichy-bit 특수권한을 설정했을 때 파일의 색이 바뀌어서 강조되며 구분하기 쉽게 만들어져있다. 

 

11 파일을 실행할 경우 진행중에는 관리자 권한을 빌려 쓰게된다. 또한 33 디렉터리는 공유되어 모든 사용자가 사용할 수 있게 된다. 즉, 쓰기(w)권한이 없는 사용자도 33디렉터리 안에서 파일을 생성할 수 있게 된다.

 

chmod 명령어

]# chmod 777 = rwxrwxrwx

]# chmod 751 = rwxr-xrwx

]# chmod 421 = r---w---x

]# chmod u+s = --s------ (7000)

]# chmod g+s = -----S--- (3000)

]# chmod o+t = --------t (1000)

chmod 명령으로 파일의 허가권을 소유자가 지정할 수 있다. 이때 허가권은 각각 권한에 숫자가 부여되어 지정할 수 있다.

 

( r = 4 / w = 2 / x = 1) 유저, 그룹, 기타사용자 세 부분으로 나누어 숫자를 지정하며 777 권한이 부여되면 모든사용자가 파일을 읽고 수정하고 실행할 수 있게 된다.

 

특수권한의 경우도 chmod 명령으로 설정할 수 있는데, 각 부분에 따라 설정된 문자를 이용해 지정하게 된다. 물론 숫자로도 지정할 수 있다. 세부분으로 나눠서 지정하는 권한을 네자리로 설정할 경우 (chmod 7000) 맨 앞자리 7은 특수권한으로 인식되서 u+s 명령과 같은 효과가 있다. (chmod 7000 = chmod u+s)

 

 

 

 

 

 

파일 링크 (심볼릭, 하드)

리눅스에서는 모든 파일에 i-node라는 번호가 임의로 부여된다. 한 서버에서 사용할 수 있는 i-node의 수는 설정할 수 있고 한정되어 있으며 i-node의 번호가 같은 파일은 이름이 달라도 내부적으로는 같은파일로 인식한다.

 

i-node 번호가 같지만 파일명이 다른 여러개의 파일을 관리하는 경우 이 파일들은 링크상태라고 부르며 링크는 디렉토리 경로를 단축하기 위해 주로 사용된다. 예를들어 B라는 파일을 만들어 다른 디렉토리의 A라는 파일에 링크를 설정할 했을 때 B파일을 실행할 경우 A파일이 실행된다.

 

링크는 ln명령으로 설정할 수 있으며 하드링크와 심볼릭링크 두 가지로 나뉜다.

 

하드링크

▶ i-node번호가 원본파일과 같다.

▶ 파일의 내용과 크기가 같다. (복사본)

▶ 링크파일을 수정할 경우, 원본파일에도 적용된다.

▶ 백업파일용으로 자주 사용

하드링크는 원본파일과 동일한 파일을 다른곳에 복사본 형태로 배치해서 여러이름으로 사용하는 것이다.

 

파일에만 부여할 수 있는 하드링크는 새로운 파일을 생성 후 원본파일과 연결해서 사용하며 파일의 내용, 크기, i-node번호 모든것이 같다. 또한 두 파일이 동기화되어 원본과 새파일 중 어느파일을 수정하더라도 양쪽 모두에 반영된다. 또한 원본파일이 삭제될 경우 링크된 새파일에는 아무런 지장이없다.

 

하드링크 사용 예시

현재 위치에 "hardlink start" 문장을 출력하는 파일을 하나 생성했다. 이후 ln명령을 통해 다른위치에 test_link라는 이름으로 하드링크 파일을 만들었다.

 

해당 위치로 가서 링크된 새파일을 실행했을 때 동일한 문장이 출력되는것을 확인할 수 있다. 이후 vim을 통해 링크파일에 "hardlink end"라는 문장을 추가했다.

 

다시 원래 위치로 돌아와 원본파일을 실행했을 때 파일의 내용이 변경되어 "hardlink start" 와 "hardlink end" 두 문장 모두 출력되는것을 확인할 수 있다.

 

이처럼 하드링크는 두 파일을 동기화시켜 하나의 파일이 지워져도 나머지 파일이 보존된다. 따라서 자동 백업되는 파일로 중요한 파일에 하드링크를 걸어 이후 백업용으로 사용하는것이 좋다.

 

 

심볼릭링크 (소프트링크)

▶ 링크파일의 크기가 매우 작다.

▶ i-node번호가 원본과 다르다. (다른파일)

▶ 원본이 삭제되면 링크파일은 쓸모가없다.

▶ 윈도우의 바로가기 기능과 유사하다.

바로가기 단축키와 흡사한 심볼릭링크는 오로지 경로를 단축하기위한 용도로 많이 사용한다.

 

하나의 파일을 여러이름으로 가리켜 원본파일을 이용할 수 있고, 원본파일과 링크된 파일은 서로 완전히 다른파일로 인식한다. 만약 링크를 통해 해당 파일을 수정할 경우 원본파일 자체를 수정하는것과 같다.

 

심볼릭링크 사용 예시

현재 /tmp/ln/test/softlink/ABC 디렉터리 안에 link라는 이름의 파일을 하나 만들었다. 이 파일은 "hi" 문장을 출력해주는 파일이다.

 

이후 다른폴더 (/tmp/test)로 이동한 뒤 soft라는 파일을 생성하면서 link라는 파일이 있는 위치에 심볼릭링크를 걸었다.

 

ls -l 명령을 통해 확인해보면 soft 디렉터리가 link파일이 있는 위치를 가리키고 있다. 실제로 이동해서 파일을 실행했을 때 동일하게 "hi" 문장이 출력되는 것을 확인할 수 있다.

 

이처럼 심볼릭링크는 복잡한 경로에 있는 파일을 보다 편하게 이용하기 위해 디렉터리 두 개를 연결해서 바로가기용도로 사용한다. 결론적으로 원본과 링크파일 두 개는 완전히 다른 파일로 인식한다.