[운영체제보안] Linux Security Basics

cloudbread·2025년 10월 10일

보안

목록 보기
2/7
post-thumbnail

1. /etc/passwd

  • 사용자 계정 정보가 저장된 텍스트 파일

    순서=> 사용자 이름 : 비밀번호 자리 : UID : GID(primary group) : comment : 홈 디렉터리 : 기본 쉘
  • 현재 cloudbread와 Ubuntu 일반사용자가 있음.
  • 계정을 더 생성하고 싶을 때는 sudo adduser 명령을 사용하면 된다.
  • 사용자 아이디로 로그인 하는 경우에는 ~$이며, 루트 아이디로 전환하는 경우는 ~#이다.

2. /etc/group

  • Linux 시스템에서 그룹 정보를 저장하는 파일
    순서 => 그룹이름 : x (암호 자리) : GID : 사용자 목록
  • sudo 그룹에 포함된 사용자는 sudo 명령을 통해 root 권한으로 명령을 실행할 수 있다.

3. /etc/shadow

  • 전통적으로 사용자 계정 정보는 /etc/passwd에 저장 되었다. 그러나 etc/passwd는 시스템에서 여러 프로세스가 읽을 수 있도록 공개되어야 하는 파일이다.
  • 비밀번호를 같은 파일에 두면 모든 사용자가 해시를 읽을 수 있게 되어 보안상 취약하다.
  • 따라서 민감한 비밀번호 해시는 읽기 권한을 엄격히 제한한 /etc/shadow로 분리하여 보관한다.
  • 해시 문자열 형식 : ididsalt$hash
  • salt를 사용하는 이유 1) 동일 비밀번호 해시 값이 계정 간에 같아지지 않음
  • salt를 사용하는 이유 2) 레인보우테이블과 대량 사전 공격을 무력화 시킴 ( 각 사용자 별로 해시를 다시 계산)
  • 1 : username
  • 2 : password (ididsalt$hashed)
    • id 1)MD5 2)3) Blowfish 5)SHA-256 6)SHA-512
  • 3: Last password change : 1970년 1월 1월 기준으로 마지막으로 바꾼게 언제인지 (숫자가 높을 수록 안좋음)
  • 4 : Minimum : 언제 password 바꿀 수 있는지
  • 5 : Maximum : 비밀번호 유효 기간
  • 6 : Warn : 비밀번호 만료 기간 시작일
  • 특수 값들의 의미
    • "*" : 관례적으로 로그인 용도가 아닌 계정 (bin,deamon,sshd)
    • ! : 잠겨있는 계정
    • !! : 계정은 생성되었지만 아직 비밀번호가 설정되지 않았음을 의미

3. Management of user and group

  • sudo adduser <사용자 이름> : 새 일반 사용자를 추가할 때 사용
  • su (switch user) : 다른 사용자로 전환할 때 사용
  • sudo groupadd <그룹 이름> : 새 그룹 생성할 때 사용
  • sudo usermod -a -G <그룹이름> <사용자 이름> : 기존 사용자를 그룹에 추가할 때 사용

4. Linux Commands

1). id

  • id 명령어를 사용하면, UID/GID 그리고 현재 포함되어있는 주그룹과 보조 그룹 모두를 확인할 수 있다.

2). ls -l /etc/suders

  • /etc/sudoers는 리눅스에서 sudo 명령어의 권한 규칙을 정의하는 파일
  • root도 기본적으로 읽기만 가능하며, 직접 쓰기는 못한다
  • 그래서 sudo visudo를 사용해서 편집해야 한다.
  • /etc/sudoers 파일을 root만 접근 가능하기 때문에, 일반 사용자가 접근하면 permission defined가 뜬다. (sudo 명령어를 사용해야만 함.)
  • /etc/sudoers의 파일 내용을 살펴보면 위의 내용을 찾아 볼 수 있는데 이는 sudo 명령어를 통해 모든 명령을 실행할 수 있음을 의미한다.

3). sudo id

  • root 권한으로 실행될 때 uid, gid, groups는 모두 0이다

4). ls -l /etc/passwd /etc/shadow /usr/bin/ls /usr/bin/passwd /usr/bin/sudo

  • /etc/passwd : 사용자 계정 정보 저장 (UID, GID, 홈, 쉘) ,모두 읽기 가능, root만 쓰기 가능
  • /etc/shadow : 비밀번호 해시 저장, root 읽기/쓰기 가능, 일반 사용자 접근 불가
  • /usr/bin/ls : 파일 목록 확인 명령, 누구나 실행 가능
  • /usr/bin/passwd : 비밀번호 변경 명령, SUID 설정 → 일반 사용자가 root 권한으로 실행 가능
  • /usr/bin/sudo : root 권한 명령 실행, SUID 설정 → 일반 사용자가 root 권한 명령 실행 가능
  • /etc/shadow는 일반 사용자는 접근 불가하기 때문에 접근하려면 sudo 명령어를 사용해야한다.

5). peintenv

  • 현재 세션에서 설정된 모든 환경 변수 출력
  • PWD는 현재 작업 디렉토리임 => 터미널에서 현재 위치한 폴더를 의미
  • XDG_SESSION_TYPE=tty : 현재 세션 유형 => 텍스트 기반 터미널
  • HOME : 현재사용자의 홈 디렉토리

6). echo $PATH

  • 실행 파일 검색 경로 확인 => 쉘이 명령어를 실행할 때 이 경로 순서대로 탐색

7). whereis ls

  • 명령어 실행 파일과 매뉴얼 경로 확인

8) ls -l /usr/bin/ls bin/ls

  • 크기와 수정 시간이 똑같음

9) ls -i /usr/bin/ls bin/ls

  • 아이노드 번호가 같음 -> 같은 실제 파일 (둘은 하드링크로 연결되어 있음) => 둘 중 하나를 수정하면 다른 하나에게도 동일하게 반영
  • 심볼릭 링크 : 다른 파일이나 디렉토리를 가리키는 포인터 (아이노드 공유 X)

10) sudo ln /usr/bin/ls

  • 하드 링크를 만드는 명령어

11) sudo su bin

  • /etc/passwd에서 bin 계정의 로그인 쉘이 sbin/nologin 또는 /bin/false 등으로 설정되어 있기 때문에 발생
  • 로그인 불가 계정은 쉘이 제한되어 있어 전환 불가

5. Root = superuser

  • root 계정은 모든 권한을 가진 사용자
  • 모든 파일을 읽고 쓰는 등 최대 권한을 가진다
  • root는 시스템 내 모든 파일의 소유자 역할을 한다
  • ROot의 UID = 0
  • UID가 0이면 계정 이름이 무엇이든 Root 권한을 사용할 수 있다. => 여러개의 root 계정을 만들 수 있음
  • 일반 사용자는 대부분의 권한이 제한된다.

6. File permissions

  • sticky bit는 주로 디렉토리에 설정되는 특수 권한 => 파일 소유자, 디렉토리 소유자 또는 root만 그 디렉토리 내의 파일을 삭제하거나 이름을 바꿀 수 있음
  • umask 0002 (others의 쓰기 권한 제거) (0666 - 0002 = 0664)
  • umask 0022 (group과 others 쓰기 권한 제거) (0666-0022=0644)
  • umask 0077 (owner,group,others 읽기/쓰기/실행 권한 제거) (0666-777) = 권한 없음

7. ACL (Access Control Lists)

  • 기존 파일 권한 확장 : 기존의 소유자, 그룹, 기타 사용자 권한 만으로는 세밀한 접근 제어 어려움 => ACL을 사용하면 특정 사용자나 그룹별로 별도의 권한 부여 가능
  • 사용 예시
    • getfacl <파일명> : 해당 파일의 ACL 확인
    • setfacl <옵션 -m , -x> > <u,g>:[r,w,x] <file,directory> : ACL 설정

8. Three methods to handle priviliges

1) setUID programs

  • SetUID란 "이 프로그램이 실행될 때, 실행한 사용자 권한이 아니라 파일 소유자 권한(root)로 실행된다는 의미이다.
  • 일반 사용자는 /etc/shadow를 직접 수정할 수 없지만, passwd 명령어는 SetUID(root) 속성을 가지고 있어서 실행 시 root 권한으로 동작하므로 비밀번호를 번경할 수 있다.
  • SetGID란 프로그램 실행 시 실행한 사용자의 그룹 권한이 아니라, 해당 파일의 그룹 권한으로 실행되는 것이다.
  • /etc/shadow 파일은 암호 해시가 저장된 매우 민감한 파일로 일반 사용자는 읽을 수 없다.
  • 그러나 chage(change Age)는 사용자가 비밀번호 만료일, 비밀번호 주기 등을 변경할 수 있도록 한다.
  • 그래서 chage 프로그램에는 SetGID 권한을 부여하여, 일반 사용자가 실행하더라도 shadow 그룹 권한으로 /etc/shadow를 읽고 수정할 수 있게 한 것이다.
  • 일반적으로 파일의 접근 권한 (permission bits)은 9비트로 표현된다. 그러나 실제로는 파일 모드(mode)가 12비트로 구성된다.
  • 추가적인 3비트 (4 : setUID, 2: setGID, 1: sticky => 디렉터리 내 파일 삭제 제한 (owner만 가능))
  • umask 값이 0022 , 즉 새로 만든 파일의 기본 권한은 666- 022 = 644 이다.
  • touch 명령으로 setuid1, setuid2 두 개의 빈 파일을 생성한다. (두 파일 권한 644)
  • chmod 4744 setuid1 : 앞의 4는 setuid bit를 의미하고 744는 권한을 의미한다. => 이로 인해 소유자 실행 권한이 s로 바뀐다.
  • chmod u+s setuid2는 사용자에게 setuid는 설정됐지만 실행권한은 없다. => 대문자 S인 경우는 실행 불가

2) sudo command

  • sudo 명령어는 sudo 그룹에 포함되어 있으면 실행이 가능하다.
  • sudo : Super-user Do
  • ubuntu에서는 기본적으로 root 계정이 잠겨 있다.
  • 그러나 관리권한이 필요한 경우에는 sudo를 통해 root 권한 셀을 얻는 여러 방법이 존재한다.
  • 장기적으로 root 셀을 남용하는 것은 권장되지 않으며, 개별 명령에만 sudo를 사용해 최소권한 원칙을 지키는 것이 바람직하다.
  • sudo -u <사용자> <명령어> : 현재 사용자가 입력된 사용자의 권한으로 명령어 실행

3) POSIX capabilities

  • Linux 커널 2.2 버전부터 슈퍼 유저 (root)가 가지고 있던 모든 권한을 세분화하여 개별 단위(capablilities)로 나누는 개념이 도입 되었다.
  • capabilities란 루트 권한을 세분화하여 필요한 권한만 부여할 수 있도록 만든 보안 기능이다.
  • 기존 방식 : 전통적으로 Linux에서 커널 기능에 대한 모든 접근 권한은 root 계정으로 실행되는 프로세스에만 부여되었다.
  • 주요 Capabilities (man capabilities로 목록 확인 가능)
    • CAP_CHOWN : 파일의 UID 소유자 또는 GID 그룹을 제한 없이 변경할 수 있는 권한
    • CAP_DAC_OVERRIDE : 파일의 읽기, 쓰기, 실행 권한 검사(DAC)를 우회(bypass) 하여 접근할 수 있는 권한
    • CAP_NET_ADMIN : 네트워크 관련 설정 및 관리 작업을 수행할 수 있는 권한
    • CAP_SETFCAP : 파일에 capabilities를 직접 부여하거나 수정할 수 있는 권한
    • CAP_SETPCAP : 프로세스의 capabilitiy 집합을 설정하거나 변경할 수 이쓴 권한
    • CAP_DAC_READ_SEARCH : 읽기 또는 디렉토리 검사에 대한 DAC 권한 검사를 우회하는 권한. 즉 읽기 권한이 없어도 파일 내용을 읽거나, 디렉토리 탐색을 할 수 있음.
    • CAP_NET_RAW : RAW 소켓을 생성하고 사용할 수 있는 권한. 즉, IP/TCP/UDP 헤더를 직접 조작하여 패킷을 송수신 할 수 있음.
    • CAP_SYS_TIME : 시스템의 날짜와 시간을 설정하거나 변경할 수 있는 권한.
    • CAP_NET_BIND_SERVICE : 1024 이하의 포트를 root 권한 없이 열 수 있음.
  • Process Capability Sets
    • Effective : 실제로 사용 중인 권한
    • Permitted : 활성화 가능한 권한 집합
    • Ingeritable : 자식 프로세스로 상속 가능한 권한

4) POSIX capabilities실습

  • Linux에서 파일의 Capability는 security.capability 확장 속성에 저장되며, 이를 조회/설정하기 위해 getcap, setcap, 또는 C용 라이브러리 libcap을 사용한다. 단, 설정을 변경하려면 CAP_SETFCAP 권한이 필요하다.
  • sudo setcap "cap_sys_time =pe" /bin/date 를 함으로써 permitted set과 effective set 권한을 주었다.
  • 이후 date 명령어는 일반 사용자로 실행해도 root 없이 시간 변경이 가능하다.
  • 리다이렉션 : > 입력 (작성) , < 출력 (읽기)
  • bin/bash를 /home/ubuntu/mybash로 복사 => 단순히 bash 실행 파일을 복사한 것 뿐이라 권한은 root 권한이 아니라 일반 사용자 권한 그대로이다.
  • /home/ubuntu/mybash 실행 후 /etc/shadow 읽기를 시도하면 permission denied가 된다.
  • 단순 복사로는 root 권한을 가진 bash를 만들 수 없음.

  • /home/ubuntu/mybash 실행 파일에 CAP_DAC_READ_SEARCH 권한 Effective + Permitted(ep)로 설정 => 이 프로그램이 실행 될 때 일반 권한으로 접근할 수 없는 파일 (/etc/shadow)도 읽기를 수행 할 수 있음.
  • getpcaps $$ 현재 쉘의 PID의 권한을 확인 가능
  • getpcaps는 실행 중 프로세스의 capablities를 확인
  • getcap은 파일 자체의 capabilities를 확인
  • 읽을 수 있는 자격만 주기 때문에 만약 쓰기도 원한다면 CAP_DAC_OVERRIDE 사용

5) SUID Bit를 POSIX Capabilities로 대체하기

  • 원래 ping 실행 권한 확인
  • SUID 비트 설정되어 있음 => 일반 사용자가 ping을 실행해도 일시적으로 root 권한으로 실행
  • SUID 비트 제거
  • 실행 하면 권한 부족 오류 발생
  • /bin/ping은 ICMP(Internet Contol Message Protocol) 패킷을 보내려면 root 권한이나 CAP_NET_RAW Capabilities가 필요하다.
  • p 권한만 주는 이유는 프로세스를 실행할 때 자동으로 권한을 사용하지 않고 필요할 때만 effective set으로 올리는 것이 안전함

9. Authentication Methods

  • 사용자가 알고 있는 것 : 비밀번호
  • 사용자가 소유한 것 : ID 카드, OTP 토큰
  • 사용자의 특성/행동 기반 : 지문, 홍채, 음성 패턴
  • 다중 인증 : 두 가지 이상의 인증 요소를 조합하여 보안 강화
profile
잡다한거 다 공부중....

0개의 댓글