본문 바로가기
정보보안기사 필기/1. 정보보안 일반

정보보안기사 필기 4-5. 유닉스/리눅스 서버 보안(패스워드 관리, 프로세스 실행권한)

by kkmin93 2022. 4. 19.
반응형

정보보안기사 필기 4-5. 유닉스/리눅스 서버 보안(패스워드 관리, 프로세스 실행권한)

1. 시스템 보안

 1) 사용자 패스워드 관리

  •  패스워드 저장 정책에는 passwd(/etc/passwd) 파일 내 계정 정보와 함께 저장하는 "일반 패스워드 정책"과 shadow(/etc/shadow) 파일에 패스워드를 별도로 저장하는 "shadow 패스워드 정책"이 있다.
  • 유닉스/리눅스 시스템에서는 shadow 파일에 암호화된 패스워드를 저장하고 root만이 접근할 수 있도록 제한하여 패스워드 보안을 강화하고 있다.(passwd 파일의 두 번째 필드에 저장하는 방식 X)

  1-1) passwd(/etc/passwd) 파일

user_account user_password user_ID group_ID comment home_directory login_shell
  • user_account : 사용자 계정명, root 계정은 시스템에 대한 총괄 권한을 가지고 있는 계정으로 공격자의 목표가 될 수 있으므로 원격 접속을 금지하는 것이 보안상 안전하다.
  • user_password : 사용자 패스워드, x의 의미는 패스워드를 사용하지 않는다는 것이 아니라 shadow 패스워드를 사용한다는 의미이다.
  • UID : 사용자 ID, root(관리자) 계정의 경우 0으로 부여한다. UID는 중복되어 사용될 수 있으며 동일한 UID가 부여된 계정은 계정명이 달라도 동일한 권한을 부여받는다. 따라서 임의로 생성된 계정에 UID가 0으로 부여되어 있다면 이는 root 권한 탈취를 위한 행위로 의심해 보아야한다.
  • GID : 사용자 기본 그룹 ID, root(관리자) 그룹의 경우 0으로 부여한다. GID도 UID와 동일하게 중복되어 부여될 수 있으므로 임의로 생성된 그룹에 GID가 0으로 부여되어있는지 점검해야 한다.
  • comment : 설명, 사용자 관련 기타 정보로 일반적으로 사용자 이름을 설정한다.
  • home_directory : 홈 디렉터리, 로그인에 성공한 후에 사용자가 위치할 홈 디렉터리로 root(관리자) 계정은 "/root" 디렉터리를 사용하며 일반 사용자는 "/home" 디렉터리 하위에 위치한다.
  • login_shell : 로그인 쉘, 리눅스의 경우 기본 쉘로 bash 쉘을 사용한다. 로그인이 불필요한 계정에 대해서는 로그인을 금지하는 것이 보안상 안전하다.

[ 그림 1-1. 불필요한 사용자 계정 로그인 통제 ]

 

  1-2) shadow(/etc/shadow) 파일

user_account encrypted_password last_change minlife maxlife warn inactive expires
  • 패스워드 정보를 평문으로 저장할 경우 정보 유출 피해가 발생할 수 있으므로 패스워드를 암호화하여 보호해야한다.
  • shadow 패스워드를 사용하여 암호화된 패스워드가 저장되도록 하고 관리자만이 읽을 수 있도록 제한한다. 기본적으로 root(관리자)만이 읽을 수 있도록 기본 접근권한이 설정되어 있다.
  • shadow 파일에는 계정별 암호화된 패스워드 정보와 패스워드 에이징(aging) 정보가 저장되어 있다. 패스워드 에이징 정보는 시간의 흐름에 따른 패스워드 관리정책을 말한다.
  • user_account : 사용자 계정명
  • encrypted_password : 암호화된 패스워드패스

[ 그림 1-2. encrypted_password 필드 구성 ]

※ "$ID$Salt$encrypted_password" 형식으로 구성
 ① ID : 암호화에 적용된 일방향 해시 알고리즘을 식별하기 위한 ID
  - 1 : MD5(안전 ▼)
  - 2 : BlowFish
  - 5 : SHA-256
  - 6 : SHA-512
 ② 솔트(Salt) : 패스워드 암호화 강도를 높이기 위한 임의의(랜덤) 값으로 사용자가 지정한 패스워드에 서로 다른 솔트를 추가하여 암호화된 패스워드(해시값)를 생성한다.
  - 동일한 패스워드여도 솔트에 의해서 실제 암호화된 패스워드(해시값)는 서로 다르다.
  - 레인보우 테이블(Rainbow Table) 공격에 효과적으로 대응할 수 있다. 
  - 레인보우 테이블(Rainbow Table) 공격 : 사전에 해시값을 계산해 두고 그 해시값에 해당하는 평문을 알아내는 공격 기법
 ③ encrypted_password : 사용자 패스워드에 솔트를 조합하여 해시한 해시값, 암호화된 패스워드

[ 그림 1-3. Salt로 인한 레인보우 테이블 공격 실패 ]

 

  • ID값 중 [*]은 패스워드가 잠긴 상태로 로그인 불가, [!!]는 기본적으로 사용자 계정을 생성하고 패스워드를 설정하지 않으면 [!!]로 설정되며 모든 로그인이 불가, [ ]은 패스워드가 설정되지 않은 상태이지만 로그인이 가능
  • last_change : 마지막으로 패스워드 변경한 날(1970년 1월 1일 기준으로 일수로 표시)
  • minlife(aging 정보) : 패스워드 최초 사용기간 설정으로 패스워드를 마지막으로 변경한 날 이후부터 패스워드를 변경할 수 없는 일수를 의미한다.
  • maxlife(aging 정보) : 패스워드 최대 사용기간 설정으로 패스워드를 마지막으로 변경한 날 이후로부터 패스워드 만료 일수를 의미한다.
  • warn(aging 정보) : 패스워드 만료 이전 경고일수를 의미한다.
  • inactive(aging 정보) : 패스워드가 만료된 이후 계정이 잠기기 전까지 비활성 일수로 해당 비활성 기간 동안에 패스워드를 변경하지 않으면 계정이 잠기게 된다.
  • expires(aging 정보) : 계정 만료일 설정
  • 패스워드 잠금 설정(Lock) 명령 : passwd -l [계정명]
  • 패스워드 잠금 해제(Unlock) 명령 : passwd -u [계정명]
  • 패스워드 설정 해제 명령 : passwd -d [계정명]

[ 그림 1-4. 패스워드 잠금 설정 및 해제 ]

  1-3) 리눅스 패스워드 정책 설정파일(/etc/login.defs)

[ 그림 1-5. /etc/login.defs 옵션 값 ]

  • 패스워드 최소 사용일수(mindays) 테스트 : 최근 암호기억을 무력화하고 자주사용하는 패스워드를 지속해서 사용하는 것을 막기위해 설정하는 값(1일로 설정하면 1일이 지나야 패스워드 변경이 가능)

[ 그림 1-6. chage 명령어로 최소 사용일수 1일로 변경 ]

  • 패스워드 만료전 경고 일수(Warn days) 테스트

[ 그림 1-7. 패스워드 만료전 경고 일수 7일로 변경 ]

  • 패스워드 최대 사용일수(Max days) 및 비활성화 일수(Inactive days) 테스트

[ 그림 1-8. 패스워드 최대 사용일수 및 비활성화 일수 변경 ]

  1-4) 패스워드 저장 정책 변경(pwconv)

  • pwconv 명령어 : 사용자 계정 패스워드 저장 정책을 shadow 패스워드 정책(암호화된 패스워드 별도 저장)으로 변경하는 명령어
  • pwunconv 명령어 : 사용자 계정 패스워드 저장 정책을 일반 패스워드 정책(passwd 파일 내 계정 정보와 함께 저장)으로 변경하는 명령어

2. 프로세스 실행권한[SUID, SGID]

 1) 프로세스 ID 종류

  1-1) 프로세스 관련 식별 ID

  • PID, PPID, PGID, SID

  1-2) 프로세스 자원접근 권한 판단하기 위한 ID

  • RUID(Real User ID) : 실행파일(프로세스)을 실행시킨 사용자의 ID
  • RGID(Real Group ID) : 실행파일(프로세스)을 실행시킨 사용자의 GID
  • EUID(Effective User ID) : 프로세스가 실행중인 동안만 부여되는 UID로 자원 접근권한을 판단하기 위한 UID로 사용된다.
  • EGID(Effective Group ID) : 프로세스가 실행중인 동안만 부여되는 UID로 자원 접근권한을 판단하기 위한 GID로 사용된다.
  • SUID(Set UID) 및 SGID(Set GID)는 프로그램이 실행중인 동안에 자원 접근권한을 실행파일 소유자/소유그룹의 권한으로 접근할 수 있도록 하는 권한설정이다.

 

  1-3) SUID(SetUID)/SGID(SetGID) 미설정 시 프로세스 접근권한(일반적인 상황)

[ 그림 2-1. SUID/SGID 미설정 시 프로세스 접근권한 ]

  • ① 사용자가 실행파일을 실행시키게 되고 프로세스의 접근권한을 판단하기 위한 ID 값이 설정(SUID/SGID 설정이 안되어 있을 시 EUID/EGID는 RUID/RGID를 따라간다)
  • ② 프로세스가 작업을 수행하던 중 커널에게 요청하여 파일에 접근(open("batch.dat"))하려고 할 때 그 때의 접근권한은 EUID/EGID(사용자)의 권한으로 접근하게 된다.

 

  1-4) SUID/SGID 미설정 시 프로세스 접근권한

[ 그림 2-2. SUID/SGID 설정 시 프로세스 접근권한

  • ① 사용자가 실행파일을 실행시키게 되면 SUID/SGID가 설정이되며, 실행파일의 권한은 "rwsrws"로 설정이 된다.
  • ② 프로세스의 접근권한을 판단하기 위한 ID 값이 설정이 되는데 EUID는 실행파일 소유자의 UID를 가지고 오고, EGID 또한 실행파일 소유자의 GUID를 가지고 오게 된다.
  • ③ 프로세스가 작업을 수행하던 중 커널에게 요청하여 파일에 접근(open("batch.dat"))하려고 할 때 그 때의 접근권한은 EUID/EGID(root)의 권한으로 접근하게 된다. 사용자가 파일을 실행했지만 실행된 그 프로세스는 root의 권한으로 실행이되고 있게된다.
  • 프로세스가 실행중인 동안에 SUID/SGID 설정함으로써 권한상승(Privilege Escalation)이 발생한다.
  • SUID가 설정된 실행 프로그램 내에서 새로운 프로그램을 실행하게 되면, 실행 프로그램의 RUID(사용자의 UID)를 기준으로 새로운 프로그램을 실행하게 된다.

  • EX) 755 접근권한 batch.dat 파일에 SUID 설정 : chmod 4755 batch.dat
  • EX) 755 접근권한 batch.dat 파일에 SGID 설정 : chmod 2755 batch.dat
  • EX) batch.dat 파일에 SUID 설정 : chmod u+s batch.dat

 

 2) SUID, SGID 실행파일 주기적 검사

  2-1) SUID/SGID가 설정된 실행파일은 일반 사용자가 사용하게되면 권한상승이 발생하게되어 조심스럽게 관리를 해주어야 한다. 임의의 실행파일에 root 소유이면서 SUID/SGID가 설정되어 있는지 주기적인 검사가 필요

  • 검사 명령어 : find / -user root -type f \(-perm -4000 -o -perm -2000 \) -exec ls -al {} \;
  • 제거 명령어 : chmod -s 실행파일명

  2-2) 디렉터리 접근권한(Sticky-bit)

  • 일반적으로 공유 디렉터리(/tmp, /var/tmp 등)는 모든 사용자가 이용할 수 있도록 user, group, other에 모두 'rwx(777)' 권한을 부여한다.
  • 이렇게 되면 다른 사용자가 만든 파일을 누구나 삭제 또는 파일명 변경을 할 수 있다는 점이다. 따라서 자유롭게 파일을 생성하되 파일 삭제나 파일명 변경은 소유자만이 가능하도록 하기위한 특수권한비트이다.
  • EX) /tmp 공유 디렉터리에 sticky-bit 설정 : chmod 1777 /tmp OR chmod o+t batch.dat
  • EX) 유닉스는 u+t로 설정, 리눅스는 o+t로 설정한다는 차이점이 있다.

 

 

 

반응형