리눅스 시스템 프로그래밍 - 사용자, 그룹 그리고 권한

김신·2022년 12월 29일
0
post-thumbnail

0. 사용자와 그룹

0.1 사용자

리눅스에서 권한은 사용자와 그룹의 형태로 제공됩니다. uid(user id)는 고유한 양수 값이며 사용자를 구분합니다. (리눅스에서는 다수의 사용자가 존재함을 허용합니다.) 따라서 프로세스마다 자신을 실행하는 사용자가 누구인지 파악하는 용도로 uid가 프로세스에 붙어 있습니다. 그리고 이를 프로세스의 실제 uid라고 합니다. uid는 리눅스 커널 내부에서 사용자를 나타내는 유일한 개념입니다. 사용자는 자신과 다른 사용자를 숫자가 아닌 사용자 이름으로 참조합니다. 이는 웹에서 IP주소 대신 이름으로 사용 대체하는 DNS서비스와 비슷합니다. 사용자 이름에 대응하는 uid는 /etc/passwd 파일에 저장되어 있으며 라이브러리 루틴은 사용자 이름에 대응하는 uid로 맵핑됩니다.

로그인 과정에서 사용자는 이름과 암호를 login 프로그램에 전달합니다. 사용자가 입력한 이름과 암호가 올바르면 login 프로그램은 etc/passwd에 지정되어 있는 사용자 로그인 셸을 실행해서 셸의 uid를 사용자 uid로 바꿉니다. 자식 프로세스는 부모 프로세스dml uid를 상속받습니다.

uid 0은 root라는 특수한 사용자를 가리킵니다. root 사용자는 특별한 권한이 있으며 시스템에서 거의 모든 작업을 실행할 수 있습니다. 예를 들면 오로지 root 사용자만이 프로세스의 uid를 바꿀 수 있습니다. 따라서 login 프로그램은 루트로 동작합니다.

실제 uid이외에, 프로세스마다 유효 uid, 저장된 uid, 파일시스템 uid가 있습니다. 실제 uid는 항상 프로세스를 시작한 사용자를 나타내지만, 유효 uid는 다른 사용자 권한으로 프로세스를 실행하도록 만드는 다양한 규칙에 따라 바뀔수도 있습니다. 저장된 uid는 원래 유요한 uid를 저장하며 이 값은 사용자가 전환하기를 원할지도 모르는 유효 uid 값을 결정하기 위해 쓰입니다. 파일 시스템 uid는 일반적으로 uid와 같으며 파일시스템 접근을 검증하는 데 쓰입니다.

0.2 그룹

모든 사용자는 하나 이상의 그룹에 속해 있습니다. 주 그룹이나 로그인 그룹은 etc/passwd에 지정하며 추가 그룹은 /etc/group에 지정합니다. 따라서 프로세스마다 대응하는 gid(group id) 이외에 실제 gid, 유효 gid, 저장된 gid, 파일시스템 gid가 있습니다. 일반적으로 프로세스는 사용자 로그인 그룹과 관련이 있으며 추가 그룹과는 관련이 없습니다.

보안 확인은 특정 범주를 만족하는 경우에만 프로세스가 해당 연산을 실행하도록 허용합니다. 역사적으로 유닉스는 흑백논리에 따라 이런 결정을 실행합니다. 예를 들어 uid가 0인 프로세스는 접근이 가능하지만, 다른 프로세스는 접근이 불가능합니다. 최근 리눅스는 이런 보안 시스템을 좀 더 일반적인 보안 시스템으로 대체했습니다. 신규 보안 시스템에서는 참/거짓을 따지는 단순한 검사를 넘어 좀 더 세밀한 접근 설정이 가능합니다.

1. 권한

리눅스의 표준 파일 접근 권한과 보안 메커니즘은 전통적인 유닉스와 동일합니다. 파일마다 소유자, 소유자 그룹, 그리고 세 가지 접근 권한 비트가 있습니다. 이 비트는 소유자, 소유자가 속한 그룹, 그 외 모든 사용자가 파일을 읽고, 쓰고, 실행할 수 있는지에 대한 능력을 기술합니다. 세 그룹별로 세 비트가 할당되어 총 아홉 비트로 표현합니다. 소유자와 접근 권한 정보는 파일의 i-node에 저장됩니다.

일반 파일의 접근 권한은 읽기, 쓰기, 실행의 3가지 권한으로 명시하므로 확실히 이해하기 쉽습니다. 일반 파일과 특수 파일 둘다 동일하게 읽기와 쓰기 권한을 적용할 수 있지만, 특수 파일에서의 읽기와 쓰기는 의미가 달라질 수도 있으며 실행 권한은 특수 파일에서 무시됩니다. 디렉터리에서 읽기 권한은 디렉터리 목록 내용을 열거하며 쓰기 권한은 디렉터리 내부에 새로운 링크를 추가하며 실행 권한은 경로 이름을 사용해서 디렉터리 내부로 들어가도록 허용합니다.

위 그림 빨간 네모에 들어있는 비트는 총 11개 입니다. 그 중 첫 비트와 마지막 비트를 제외하면 총 9개의 비트가 남습니다. 3개 단위로 묶어서 첫 묶음은 소유자, 다음은 소유자 그룹, 마지막은 그 외 모든 사용자의 권한을 나타내는 묶음입니다. '-'처리가 되어 있지 않음은 권한이 있음을 나타냅니다. r은 읽기, w는 쓰기, x는 실행의 권한이 각 묶음의 담당에게 있음을 나타냅니다.

0개의 댓글