특수 권한을 사용하여 Linux 파일 시스템 보안을 위한 모범 사례
Linux 파일 권한은 시스템 보안의 기반이며, 파일 읽기, 쓰기, 실행 권한을 제어합니다. 표준 읽기/쓰기/실행 권한(rwx)이 기본이지만, Linux는 실행 컨텍스트와 공유 리소스 무결성을 관리하기 위해 특수 권한 비트인 SUID, SGID 및 Sticky Bit를 도입했습니다. 이러한 권한을 마스터하면 관리자는 필요한 기능을 보장하면서 보안 위험을 최소화하면서 특정 상승된 기능을 안전하게 부여할 수 있습니다.
이 가이드는 Set User ID(SUID), Set Group ID(SGID) 및 Sticky Bit의 실제 적용 및 보안 영향을 심층적으로 살펴봅니다. 이러한 기능을 언제 어떻게 배포해야 하는지 이해하는 것은 Linux 환경의 전반적인 보안 상태를 손상시키지 않으면서 운영 효율성을 유지하는 데 중요합니다.
표준 권한 이해 복습
특수 권한을 탐색하기 전에 소유자, 그룹 및 기타에 대한 표준 삼중항 표기법(rwx)을 기억하는 것이 중요합니다. 이러한 권한은 10진수 값(예: 755 또는 644)을 사용하여 숫자 방식으로 표현됩니다.
r(읽기) = 4w(쓰기) = 2x(실행) = 1
특수 권한은 이 기본 동작을 수정하며 네 번째 선행 10진수 숫자(4, 2 또는 1)로 표현됩니다.
특수 권한: SUID, SGID 및 Sticky Bit
특수 권한은 표준 액세스 제어를 넘어서는 기능을 추가합니다. 일반적으로 긴 목록(ls -l) 출력에서 표준 x 플래그를 s 또는 t로 대체하여 표시됩니다.
| 권한 | 10진수 값 | 효과 |
|---|---|---|
| SUID (Set User ID) | 4 | 파일은 (실행 중인 사용자 대신) 파일 소유자의 권한으로 실행됩니다. |
| SGID (Set Group ID) | 2 | 파일은 파일 그룹의 권한으로 실행되거나, 새 파일은 부모 디렉터리의 그룹 ID를 상속합니다. |
| Sticky Bit | 1 | 사용자가 쓰기 권한이 있더라도 공유 디렉터리에서 다른 사용자의 소유인 파일을 삭제하거나 이름을 바꾸지 못하도록 합니다. |
1. Set User ID (SUID)
SUID 비트는 강력하며 오용될 경우 위험할 수 있습니다. 실행 가능한 파일에 설정되면 모든 사용자는 해당 파일을 실행할 때 소유자의 권한으로 프로세스를 실행합니다.
실제 사용 사례: 특정 작업을 수행하기 위해 루트 권한이 필요하지만 사용자에게 일반 루트 액세스 권한을 부여해서는 안 되는 유틸리티.
예: /usr/bin/passwd에 SUID 설정
/usr/bin/passwd 명령은 일반적으로 보안 /etc/shadow 파일을 수정하기 위해 루트 액세스가 필요합니다. SUID 비트가 설정되어 있어 일반 사용자가 자신의 암호를 변경하기 위해 passwd 실행 시간 동안만 소유자(루트) 권한을 일시적으로 얻을 수 있습니다.
SUID 보기: 소유자의 실행 슬롯에 있는 s를 확인하세요:
ls -l /usr/bin/passwd
# 출력 예시: -rwsr-xr-x 1 root root ... /usr/bin/passwd
SUID 설정: 10진수 값 4와 표준 권한(예: 755가 4755가 됨)을 결합하여 사용합니다:
# 'my_script'가 'appuser' 소유라고 가정
chmod 4755 /path/to/my_script
SUID에 대한 보안 경고: 일반적인 셸(예:
/bin/bash)이나 외부 입력을 해석하는 스크립트에는 SUID 비트를 절대 설정하지 마세요. 이는 파일을 실행하는 모든 사람에게 무제한 루트 액세스 권한을 부여합니다.
2. Set Group ID (SGID)
SGID 비트는 파일 또는 디렉터리에 적용되는지에 따라 두 가지 주요 기능을 갖습니다.
A. 실행 파일에 SGID 설정
실행 파일에 설정되면 프로세스는 사용자의 기본 그룹이 아닌 파일의 그룹 소유권과 관련된 권한으로 실행됩니다.
B. 디렉터리에 SGID 설정(공유 환경에 중요)
디렉터리에 설정되면 해당 디렉터리 내에서 생성된 모든 새 파일 또는 하위 디렉터리는 새 파일을 생성한 사용자의 기본 그룹이 아닌, 부모 디렉터리의 그룹 소유권을 자동으로 상속합니다.
실제 사용 사례: 모든 기여자가 협업을 위해 통일된 그룹 액세스 권한을 가져야 하는 공유 프로젝트 폴더.
디렉터리에 SGID 설정: 10진수 값 2와 표준 권한(예: 775가 2775가 됨)을 결합하여 사용합니다:
# 그룹 소유권을 'developers'로 설정하고 SGID 활성화
chgrp developers /srv/shared_project
chmod 2775 /srv/shared_project
3. Sticky Bit
Sticky Bit(또는 Save Text Attribute)는 파일 삭제를 제어하기 위해 거의 전적으로 공유 디렉터리에 사용됩니다.
디렉터리에 Sticky Bit가 설정되면, 해당 디렉터리 내의 파일 소유자 또는 루트 사용자만 해당 파일을 삭제하거나 이름을 바꿀 수 있습니다. 디렉터리 자체가 '기타'(o+w)에 대한 쓰기 권한을 허용하더라도 말입니다.
실제 사용 사례: /tmp 또는 부서 업로드 폴더와 같이 사용자가 자신이 만든 파일만 관리해야 하는 공개 공유 디렉터리.
예: /tmp 디렉터리
/tmp 디렉터리는 종종 1777과 같은 권한을 가집니다. 1은 Sticky Bit가 활성화되었음을 나타냅니다.
ls -ld /tmp
# 출력 예시: drwxrwxrwt 15 root root 4096 Mar 10 11:30 /tmp
끝에 있는 t는 sticky bit가 설정되었음을 확인합니다. 이것이 없으면 어떤 사용자든 /tmp에서 다른 사용자가 만든 파일을 삭제할 수 있습니다.
Sticky Bit 설정: 10진수 값 1과 표준 권한(예: 777이 1777이 됨)을 결합하여 사용합니다:
chmod 1777 /var/public_uploads
포괄적인 관리: 특수 권한 결합
특수 권한은 종종 결합됩니다. 네 번째 선행 숫자는 원하는 특수 비트의 합입니다(4+2+1 = 7).
| 원하는 권한 | 10진수 값 |
|---|---|
표준 rwxr-xr-x (755) |
755 |
SUID + rwxr-xr-x |
4755 |
SGID + rwxr-xr-x |
2755 |
Sticky Bit + rwxrwxrwx |
1777 |
SUID + SGID + Sticky Bit + rwx (거의 필요 없음) |
7777 |
공유 폴더에 대한 SGID 및 Sticky Bit 결합 예시:
모든 사용자가 'team' 그룹에 속하고, 새 파일이 'team' 그룹을 상속하며, 사용자가 서로의 파일을 삭제할 수 없는 안전한 공유 협업 디렉터리를 만들려면:
- 그룹 소유권 설정:
chgrp team /data/projectX - SGID(2) + 표준
rwx(7) + Sticky Bit(1) 적용 $\rightarrow$ 특수 비트의 경우 2+1 = 3.- 명시적 합 사용: SGID(2) + Sticky Bit(1) = 3. 표준 권한
775. - 전체 명령:
chmod 3775 /data/projectX
- 명시적 합 사용: SGID(2) + Sticky Bit(1) = 3. 표준 권한
이것을 볼 때: drwxrwxrw t (rwx도 그룹 비트로 사용된 경우 drwxrwsrw t)
특수 권한 보안 모범 사례
SUID 및 SGID가 부여하는 상승된 권한으로 인해 매우 신중하게 관리해야 합니다.
- SUID 범위 제한: 표준 작업(예:
passwd,ping)에 필요한 컴파일된 바이너리 실행 파일에만 SUID를 설정하세요. 입력 유효성을 검사하는 보안 래퍼 실행 파일에 래핑되지 않은 한 해석된 스크립트(셸, Python, Perl)에는 SUID를 절대 적용하지 마세요. - 정기 감사:
find명령을 사용하여 비정상적인 SUID/SGID 파일을 정기적으로 파일 시스템에서 검색하세요:
bash # SUID가 설정된 모든 파일 찾기 find / -perm /4000 2>/dev/null # SGID가 설정된 모든 파일 찾기 find / -perm /2000 2>/dev/null - 그룹 일관성을 위해 SGID 사용: 공유 데이터 구조에서 파일 그룹 소유권을 수동으로 관리하는 대신 SGID를 선호하세요. 그룹 상속을 자동화합니다.
- 공개 쓰기 가능 영역에 대한 Sticky Bit: Sticky Bit는 소유자가 아닌 사용자의 삭제를 제한해야 하는 일반 사용자 사용을 위한 모든 디렉터리에 필수적입니다(예:
/tmp,/var/tmp).
필요한 상승된 작업을 위해 SUID를 신중하게 사용하고, 일관된 그룹 관리를 위해 SGID를 사용하며, 공유 디렉터리 무결성을 위해 Sticky Bit를 사용함으로써 관리자는 매우 기능적이면서도 강력하게 보안된 Linux 파일 시스템 환경을 구축할 수 있습니다.