리눅스 시스템 보안
IT 위키
더 많은 작업
리눅스 서버를 계정, 권한, 인증, 원격 접속, 파일 무결성 측면에서 안전하게 운영하기 위한 설정을 정리한 문서이다. 네트워크 공격과 방화벽은 리눅스 네트워크 보안 문서에서 다룬다.
- 불필요한 계정은 지우거나 셸을 /sbin/nologin으로 바꾼다.
- UID 0 계정이 root 하나뿐인지 확인한다.
# awk -F: '$3 == 0 {print $1}' /etc/passwd
- 비밀번호 정책 : /etc/login.defs의 PASS_MAX_DAYS, PASS_MIN_DAYS, PASS_WARN_AGE, 이미 있는 계정은 chage로 바꾼다.
- 비밀번호 복잡도 : /etc/security/pwquality.conf (minlen, dcredit, ucredit, lcredit, ocredit). 리눅스 패스워드 복잡도 참조
- 로그인 실패 잠금 : pam_faillock(RHEL 8) 또는 pam_tally2(예전 버전)
- 자동 로그아웃 : /etc/profile에 TMOUT=600 (초 단위)
- root 원격 로그인 제한 : /etc/securetty(터미널 제한), sshd_config의 PermitRootLogin
- su 사용 제한 : wheel 그룹만 su를 쓰도록 /etc/pam.d/su의 pam_wheel.so 줄을 켠다.
일반 사용자가 허용된 명령만 root 권한으로 실행하게 한다. 설정은 반드시 visudo로 편집한다. 자세한 내용은 리눅스 sudo 문서를 본다.
# /etc/sudoers root ALL=(ALL) ALL %wheel ALL=(ALL) ALL kaituser ALL=(root) NOPASSWD: /usr/bin/systemctl restart httpd
- 형식 : 사용자 호스트=(실행 사용자) 명령
- %는 그룹을 뜻한다.
# find / -perm -4000 -type f 2>/dev/null # find / -perm -2000 -type f 2>/dev/null
PAM(Pluggable Authentication Modules)은 프로그램이 인증 방식을 직접 구현하지 않고 설정 파일로 고르게 한다.
- 설정 위치 : /etc/pam.d/서비스명, 모듈 위치 : /lib64/security/
- 형식 :
모듈 타입 제어 플래그 모듈 경로 인수
| 모듈 타입 | 역할 |
|---|---|
| auth | 사용자 인증 (비밀번호 확인) |
| account | 계정 사용 가능 여부 (만료, 접근 시간) |
| password | 비밀번호 변경 |
| session | 로그인 전후 처리 (로그 기록, 마운트) |
| 제어 플래그 | 의미 |
|---|---|
| required | 실패해도 나머지 모듈을 계속 실행한 뒤 최종 실패로 처리 |
| requisite | 실패하면 즉시 실패로 끝냄 |
| sufficient | 성공하고 앞서 required 실패가 없으면 즉시 성공으로 끝냄 |
| optional | 결과가 전체 성공·실패에 영향을 주지 않음 (유일한 모듈이면 반영) |
| include | 다른 설정 파일의 줄을 가져옴 |
SELinux는 파일·프로세스에 보안 문맥(context)을 붙여 강제적 접근 통제(MAC)를 하는 커널 기능이다. RHEL·Rocky에서 기본으로 켜져 있다.
- 모드 : enforcing(차단), permissive(기록만), disabled(끔)
- 설정 파일 : /etc/selinux/config 의 SELINUX= 값 (재부팅 후 반영)
| 명령어 | 용도 |
|---|---|
| getenforce, sestatus | 현재 모드 확인 |
| setenforce 0 / 1 | permissive / enforcing으로 바로 전환 (재부팅하면 설정 파일 값으로 돌아감) |
| ls -Z, ps -Z | 파일·프로세스 보안 문맥 확인 |
| chcon, restorecon | 보안 문맥 변경, 기본값으로 복원 |
| semanage port -a -t http_port_t -p tcp 8080 | 서비스 포트 허용 |
| getsebool, setsebool -P | SELinux 불리언 확인·영구 변경 |
- SSH 설정 파일 : /etc/ssh/sshd_config (서버), /etc/ssh/ssh_config (클라이언트)
- Port 22 : 포트 변경
- PermitRootLogin no : root 직접 로그인 금지
- PasswordAuthentication no : 비밀번호 대신 키 인증만 허용
- AllowUsers, DenyUsers : 접속 허용·거부 사용자
- 키 인증 : ssh-keygen으로 키 쌍을 만들고 ssh-copy-id로 공개키를 서버의 ~/.ssh/authorized_keys에 넣는다.
- TCP Wrapper : /etc/hosts.allow, /etc/hosts.deny로 접근을 통제한다. 허용 파일을 먼저 확인한다. (RHEL 8에서는 제거되어 방화벽으로 대신한다)
- 평문 서비스(telnet, rsh, rlogin, ftp)는 쓰지 않는다.
- PAM 모듈 타입 4가지와 제어 플래그 required·requisite·sufficient·optional의 차이
- SetUID·SetGID 파일을 찾는 find 명령
- SELinux 모드 3가지와 setenforce·getenforce
- sshd_config의 PermitRootLogin, TCP Wrapper 파일 확인 순서
- sudoers 형식과 visudo