리눅스 사용자 및 권한 관리

쑤욱가앗·2025년 10월 13일

Study

목록 보기
9/24

다중 사용자 환경과 접근 제어의 원칙

리눅스 시스템에서의 사용자 및 권한 관리의 중요성

리눅스 운영 체제는 설계 초기부터 다수의 사용자가 동시에 시스템 자원에 접근하고 작업을 수행하는 다중 사용자(Multi-User) 환경을 전제로 개발되었다. 이러한 환경에서 시스템의 안정성과 보안을 유지하기 위한 핵심적인 메커니즘이 바로 사용자 및 권한 관리이다. 각 사용자 계정과 시스템에서 실행되는 모든 프로세스는 파일, 디렉토리, 장치 등 다양한 자원에 접근을 시도하며, 정교한 권한 관리 체계 없이는 중요한 시스템 파일이 손상되거나 사용자 데이터가 유출되는 등 심각한 문제가 발생할 수 있다.

따라서, 각 사용자 및 그룹에 대해 자원 접근 권한을 명확히 정의하고 강제하는 것은 데이터의 무결성을 보장하고, 시스템의 안정성을 유지하며, 정보 보안을 확립하는 데 필수적인 요소이다. 권한 관리의 실패는 곧 시스템 전체의 보안 실패로 이어질 수 있으며, 이는 서비스 중단, 데이터 유출, 시스템 완전 장악과 같은 치명적인 결과를 초래할 수 있다.

최소 권한의 원칙(Principle of Least Privilege, PoLP)

본 문서 전체를 관통하는 가장 핵심적인 보안 철학은 '최소 권한의 원칙(Principle of Least Privilege, PoLP)'이다. 이 원칙은 시스템 내의 모든 사용자 계정, 애플리케이션, 프로세스는 자신의 역할이나 작업을 수행하는 데 필요한 최소한의 권한만을 가져야 한다고 정의한다. 즉, 필요 이상의 권한을 부여하지 않음으로써 잠재적인 위협 요소를 근본적으로 제거하는 방어적 보안 전략이다.

최소 권한의 원칙을 적용함으로써 얻을 수 있는 핵심적인 이점은 다음과 같다.

  • 공격 표면 최소화: 시스템 내에 존재하는 권한이 적을수록 공격자가 악용할 수 있는 잠재적인 진입점이나 권한 상승 경로가 줄어든다. 불필요한 권한을 사전에 제거함으로써 시스템의 전반적인 공격 표면(Attack Surface)이 축소된다.

  • 피해 확산 방지 (Blast Radius Reduction): 특정 사용자 계정이나 애플리케이션이 침해되더라도, 해당 주체가 보유한 권한이 최소한으로 제한되어 있기 때문에 공격으로 인한 피해 범위가 국소적으로 한정된다. 이는 공격자가 시스템 전체로 측면 이동(Lateral Movement)을 하거나 더 높은 권한을 탈취하는 것을 어렵게 만든다.

  • 운영 안정성 향상: 강력한 권한을 가진 사용자가 실수로 중요한 파일을 삭제하거나 시스템 설정을 잘못 변경하는 등의 인적 오류(Human Error) 가능성을 줄인다. 이는 시스템 장애 발생률을 낮추고 전반적인 운영 안정성을 높이는 효과를 가져온다.

이처럼 최소 권한의 원칙은 단순히 보안을 강화하는 것을 넘어, 시스템의 안정적이고 예측 가능한 운영을 보장하는 기반이 된다.

리눅스 사용자 및 그룹의 내부 구조

리눅스 시스템에서 사용자 및 권한 관리는 시스템 내 특정 파일에 명확하게 정의된 텍스트 데이터를 기반으로 동작한다. 내부 구조를 이해하는 것은 권한 관리의 본질을 파악하는 첫걸음이다.

사용자(User)와 그룹(Group)의 개념: UID와 GID

리눅스 커널은 사용자와 그룹을 이름으로 인식하지 않고, 고유한 숫자 식별자를 통해 권한을 확인하고 접근을 제어한다.

  • UID (User IDentifier): 각 사용자를 고유하게 식별하는 정수 값이다.

  • GID (Group IDentifier): 각 그룹을 고유하게 식별하는 정수 값이다.

특히, UID와 GID 0은 시스템에서 절대적인 권한을 가진 슈퍼유저(superuser), 즉 root 계정을 위해 예약되어 있다. 이 때문에 UID가 0인 계정을 추가로 생성하는 것은 심각한 보안 위험을 초래할 수 있다.

사용자 정보 데이터베이스: /etc/passwd 파일 분석

/etc/passwd 파일은 리눅스 시스템의 모든 사용자 계정에 대한 핵심 정보를 담고 있는 텍스트 기반 데이터베이스이다. 각 사용자의 정보는 한 줄로 표현되며, 각 필드는 콜론(:)으로 구분된다.

필드필드명설명
1Username사용자의 로그인 이름. 시스템 내에서 고유해야 한다.
2Password패스워드 필드. 현재는 x로 표시되며, 실제 암호는 /etc/shadow에 저장됨을 의미한다.
3UID사용자의 고유 ID. 0은 root를 의미한다.
4GID사용자가 속한 기본 그룹(Primary Group)의 GID이다.
5GECOS사용자에 대한 추가 정보(Comment)이다.
6Home Directory사용자의 홈 디렉토리 절대 경로이다.
7Login Shell로그인 시 기본으로 실행될 쉘 프로그램의 경로이다.

암호화된 패스워드 및 정책 저장소: /etc/shadow 파일 분석

과거 /etc/passwd 파일에 암호화된 패스워드가 저장되어 무차별 대입 공격(Brute-force attack)에 취약했던 문제를 해결하기 위해, 패스워드 관련 민감 정보는 root만 접근 가능한 /etc/shadow 파일로 분리하여 저장한다. 이는 최소 권한의 원칙을 시스템 설계에 적용한 대표적인 사례이다.

/etc/shadow 파일은 총 9개의 필드로 구성되며, 암호화된 패스워드와 만료 정책을 담고 있다.

필드필드명설명
1Username사용자 로그인 이름이다.
2Encrypted Password암호화된 패스워드 문자열이다.
3Last Password Change마지막 패스워드 변경일이다.
4Minimum Password Age패스워드 변경 후 재변경까지 필요한 최소 일수이다.
5Maximum Password Age패스워드 최대 사용 가능 일수이다.
6Warning Period패스워드 만료 전 경고 시작 기간이다.
7Inactive Period패스워드 만료 후 계정 비활성화까지의 유예 기간이다.
8Expiration Date계정 자체가 만료되는 날짜이다.
9Reserved예약된 필드이다.

암호화된 패스워드 필드는 $id$salt$hashed 구조로 이루어진다. 여기서 salt는 동일한 패스워드라도 다른 해시 결과를 생성하여 레인보우 테이블(Rainbow Table) 공격을 무력화하는 결정적인 역할을 한다.

그룹 정보 데이터베이스: /etc/group 파일 분석

/etc/group 파일은 시스템에 존재하는 모든 그룹의 정보를 정의한다. 사용자는 하나의 기본 그룹과 여러 개의 보조 그룹에 동시에 속할 수 있으며, 파일 접근 권한은 속한 모든 그룹을 기준으로 확인된다.

필드필드명설명
1Group Name그룹의 고유한 이름이다.
2Group Password그룹 패스워드 필드(x), 현재는 거의 사용되지 않는다.
3GID그룹의 고유 ID이다.
4Group Members이 그룹을 보조 그룹으로 사용하는 사용자 목록이다.

사용자 및 그룹 계정 관리

시스템 관리자는 설정 파일을 직접 편집하기보다, useradd, usermod와 같은 명령어를 사용하여 계정을 관리한다. 이 명령어들은 관련 파일들을 원자적으로 수정하여 데이터 일관성을 보장하고 실수를 방지한다.

사용자 계정 생성 및 설정: useradd 명령어 심층 분석

useradd 명령어는 새로운 사용자 계정을 생성하며, 관련 파일 수정 및 홈 디렉토리 생성 등 복합적인 작업을 수행한다.

옵션설명관련 파일 및 필드
-u, --uid사용자의 UID를 직접 지정한다./etc/passwd (3번째 필드)
-g, --gid사용자의 기본 그룹을 지정한다./etc/passwd (4번째 필드)
-G, --groups사용자가 속할 보조 그룹을 지정한다./etc/group (4번째 필드)
-d, --home-dir사용자의 홈 디렉토리 경로를 지정한다./etc/passwd (6번째 필드)
-m, --create-home홈 디렉토리가 없으면 생성한다.파일 시스템 작업
-s, --shell사용자의 로그인 쉘을 지정한다./etc/passwd (7번째 필드)
-c, --comment사용자에 대한 설명을 추가한다./etc/passwd (5번째 필드)
-e, --expiredate계정 만료 날짜를 지정한다./etc/shadow (8번째 필드)
-r, --system홈 디렉토리를 생성하지 않는 시스템 계정을 생성한다.시스템 계정 생성 규칙 적용
  • 실행 예시:

    # useradd -u 1001 -g users -G wheel,dev -d /home/newdev -m - s /bin/bash -c "New Developer" newdev

    시스템에 'New Developer'라는 설명을 가진 newdev라는 이름의 사용자를 생성한다. 이 사용자는 UID 1001을 가지며, 기본 그룹은 users이다. 또한, wheel과 dev 그룹의 멤버로 추가되어 해당 그룹들이 가진 권한을 함께 부여받는다. 로그인 시에는 /bin/bash 쉘을 사용하며, 개인 홈 디렉토리로 /home/newdev가 자동으로 생성된다.

사용자 계정 속성 변경: usermod 명령어 활용

usermod 명령어는 기존 사용자의 계정 정보를 변경한다. 가장 주의해야 할 옵션은 -aG로, -a 옵션 없이 -G만 사용하면 기존 보조 그룹 목록이 덮어씌워진다.

  • 보조 그룹 추가: usermod -aG docker devops_user

  • 계정 잠금/해제: -L (lock) 옵션은 로그인을 막고, -U (unlock) 옵션은 해제한다.

# usermod -L suspicious_user
# usermod -U suspicious_user
  • 홈 디렉토리 이동: -d와 -m 옵션을 함께 사용하여 홈 디렉토리와 그 내용을 이동시킨다.
# usermod -d /data/users/newdev -m newdev

패스워드 및 계정 만료 정책 관리: passwd와 chage

  • passwd: 사용자의 패스워드를 안전하게 설정 및 변경하는 기본 도구이다.

  • chage: /etc/shadow 파일의 패스워드 노화 정책을 세밀하게 제어하는 강력한 도구이다. 이를 통해 조직의 보안 정책에 맞춰 패스워드 만료 주기 등을 강제할 수 있다.

    chage 옵션설명관련 /etc/shadow 필드
    -l, --list사용자의 현재 정책을 출력한다.-
    -M, --maxdays패스워드 최대 사용 기간을 설정한다. (e.g., 90)5번째 필드
    -m, --mindays패스워드 최소 사용 기간을 설정한다. (e.g., 1)4번째 필드
    -W, --warndays패스워드 만료 경고 기간을 설정한다. (e.g., 7)6번째 필드
    -E, --expiredate계정 만료일을 설정한다.8번째 필드
    -d, --lastday마지막 패스워드 변경일을 설정한다. 0으로 설정 시 즉시 변경을 강제한다.3번째 필드

기타 관리 명령어: userdel, groupadd, groupmod

  • userdel: 사용자 계정을 삭제한다. 보안 및 시스템 정리 관점에서 -r 옵션을 함께 사용하여 사용자의 홈 디렉토리까지 완전히 제거하는 것이 모범 사례이다.

    # userdel -r old_user
  • groupadd, groupmod, groupdel: 그룹을 생성, 변경, 삭제하는 기본적인 그룹 관리 명령어들이다.

표준 파일 시스템 권한 모델

리눅스의 모든 파일과 디렉토리는 접근 제어를 위해 소유권(Ownership)허가권(Permission)으로 구성된 메타데이터를 가진다.

소유권(Ownership)과 허가권(Permission)의 이해

  • 소유권: 모든 파일/디렉토리는 반드시 하나의 사용자(Owner)와 하나의 그룹(Group)에 의해 소유된다.

  • 허가권: 접근 제어는 소유자(User), 그룹(Group), 그 외 사용자(Other) 세 범주로 구분된다.

rwx 권한의 해석: 파일과 디렉토리에서의 차이점 분석

읽기(r), 쓰기(w), 실행(x) 권한은 대상이 파일인지 디렉토리인지에 따라 그 의미가 다르게 해석된다.

권한파일(File)에 대한 의미디렉토리(Directory)에 대한 의미
r (Read)파일의 내용을 읽을 수 있다.디렉토리 내 파일 목록을 조회할 수 있다 (ls).
w (Write)파일의 내용을 수정할 수 있다.디렉토리 내에서 파일 생성, 삭제, 이름 변경이 가능하다.
x (Execute)파일을 프로그램으로서 실행할 수 있다.디렉토리 안으로 진입(cd)하거나 접근할 수 있다.

예를 들어, 어떤 디렉토리에 r-- 권한만 있다면 파일 목록은 볼 수 있지만, cd 명령으로 들어갈 수 없다. 디렉토리에 대한 x 권한은 내부 자원에 접근하기 위한 '관문' 역할을 한다.

권한 변경: chmod 명령어 (8진수 및 기호 모드)

chmod 명령어는 파일과 디렉토리의 허가권을 변경한다.

  • 8진수 모드: 권한을 숫자 값(r=4, w=2, x=1)의 조합으로 표현한다.

    chmod 755 my_script.sh -> 소유자: rwx (7), 그룹: r-x (5), 기타: r-x (5)

  • 기호 모드: 대상(u, g, o, a), 연산자(+, -, =), 권한(r, w, x)을 조합하여 직관적으로 변경한다.

    chmod u+x my_script.sh -> 소유자에게 실행 권한 추가.

    chmod go-w sensitive_data.txt -> 그룹과 기타 사용자의 쓰기 권한 제거.

소유권 변경: chown 및 chgrp 명령어

  • chown: 파일이나 디렉토리의 소유자와 그룹을 변경한다.

    chown www-data:www-data /var/www/html/index.html

  • chgrp: 파일이나 디렉토리의 소유 그룹만을 변경한다.

두 명령어 모두 -R 옵션을 사용하여 디렉토리 하위의 모든 내용에 재귀적으로 적용할 수 있다.

고급 권한 관리 기법

표준 UGO 모델의 한계를 넘어 더 세밀한 제어가 필요할 때, 리눅스는 특수 권한과 접근 제어 목록(ACLs)을 제공한다.

특수 권한(Special Permissions)

SetUID(Set User ID)

  • 동작 원리: SetUID 비트가 설정된 실행 파일을 사용자가 실행하면, 해당 프로세스는 파일을 실행한 사용자가 아닌, 파일 소유자의 권한으로 실행된다.

  • 활용 사례: /usr/bin/passwd 명령어가 대표적이다. 일반 사용자가 자신의 패스워드를 변경하기 위해 실행하면, 이 프로세스는 일시적으로 root 권한을 획득하여 /etc/shadow 파일을 수정한다.

  • 보안 위협: 만약 root 소유의 SetUID 파일 자체에 프로그래밍 취약점이 존재한다면, 공격자는 이를 악용하여 root 권한의 쉘을 획득할 수 있다. 이는 리눅스 시스템에서 가장 흔한 권한 상승(Privilege Escalation) 공격 경로 중 하나이다. 시스템 관리자는 find / -perm -4000 -type f 명령으로 시스템 내 모든 SetUID 파일을 정기적으로 감사하고 불필요한 경우 즉시 제거해야 한다.

  • 설정 방법:

    • 기호 모드: chmod u+s [파일명]

      사용자(user) 권한 영역에 SetUID 비트(+)를 추가(s)한다.

    • 8진수 모드: chmod 4755 [파일명]

      가장 앞자리에 숫자 4를 추가하여 SetUID를 설정한다. (755는 일반적인 실행 파일 권한)

SetGID(Set Group ID)

  • 파일: SetUID와 유사하게, 프로세스의 유효 그룹 ID가 파일의 소유 그룹 ID로 변경된다.

  • 디렉토리 (핵심 기능): 디렉토리에 SetGID가 설정되면, 그 안에 새로 생성되는 모든 파일과 하위 디렉토리는 상위 디렉토리의 그룹 소유권을 자동으로 상속받는다. 이는 협업 환경에서 파일의 그룹 소유권을 일관되게 유지하는 데 매우 유용하다.

  • 설정 방법:

    • 기호 모드: chmod g+s [디렉토리명]

      그룹(group) 권한 영역에 SetGID 비트(+)를 추가(s)한다.

    • 8진수 모드: chmod 2775 [디렉토리명]

      가장 앞자리에 숫자 2를 추가하여 SetGID를 설정한다. (775는 그룹 멤버의 쓰기 권한을 포함한 협업 디렉토리 권한)

Sticky Bit

  • 동작 원리: Sticky Bit가 설정된 디렉토리 내에서는, 파일 삭제나 이름 변경은 오직 파일 소유자, 디렉토리 소유자, 그리고 root 사용자만 할 수 있다.

  • 활용 사례: 시스템의 모든 사용자가 임시 파일을 생성하는 /tmp 디렉토리가 대표적인 예이다. Sticky Bit 덕분에 사용자들이 자유롭게 파일을 생성하면서도, 다른 사용자의 파일을 임의로 삭제하는 것을 방지한다.

  • 설정 방법:

    • 기호 모드: chmod +t [디렉토리명]

      기타 사용자(other) 권한 영역에 Sticky Bit(+)를 추가(t)한다.

    • 8진수 모드: chmod 1777 [디렉토리명]

      가장 앞자리에 숫자 1을 추가하여 Sticky Bit를 설정한다. (777은 모든 사용자가 읽고 쓰고 실행할 수 있는 공용 디렉토리 권한)

접근 제어 목록(Access Control Lists, ACLs)

표준 권한 모델의 한계와 ACL의 필요성

표준 UGO 모델은 소유자, 단 하나의 그룹, 그리고 나머지로만 접근 주체를 구분하기 때문에 복잡한 권한 요구사항을 충족시키기 어렵다. ACL은 표준 권한을 넘어, 임의의 특정 사용자나 그룹에 대해 개별적인 rwx 권한을 추가로 정의할 수 있게 해주는 확장된 권한 관리 프레임워크이다.

getfacl 및 setfacl을 이용한 세밀한 권한 제어

  • getfacl: 파일/디렉토리에 적용된 ACL 항목을 확인한다. ls -l 출력 시 권한 끝에 + 기호가 있으면 ACL이 설정된 것이다.

  • setfacl: ACL 규칙을 설정하거나 수정한다.

  • -m (modify): 특정 사용자나 그룹에 권한을 추가/수정한다.

# bob 사용자에게 읽기/쓰기 권한 부여
setfacl -m u:bob:rw- report.docx
# managers 그룹에 읽기 권한 부여
setfacl -m g:managers:r-- report.docx
  • -x (remove): 특정 ACL 항목을 제거한다.

  • -b (remove-all): 모든 확장 ACL 항목을 제거한다.

Default ACL을 통한 권한 상속 관리

Default ACL은 디렉토리에만 설정 가능하며, 그 디렉토리 내부에 새로 생성되는 모든 파일과 하위 디렉토리는 해당 Default ACL 규칙을 자동으로 상속받는다. 이는 디렉토리의 SetGID 비트와 함께 사용될 때 가장 강력한 시너지를 발휘하여, 프로젝트 협업 디렉토리의 소유권과 접근 권한을 완전히 자동화할 수 있다.

profile
Incident Response

0개의 댓글