본문으로 이동
메뉴 여닫기
환경 설정 메뉴 여닫기
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.

리눅스 서버를 계정, 권한, 인증, 원격 접속, 파일 무결성 측면에서 안전하게 운영하기 위한 설정을 정리한 문서이다. 네트워크 공격과 방화벽은 리눅스 네트워크 보안 문서에서 다룬다.

  • 불필요한 계정은 지우거나 셸을 /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
  • 누구나 쓸 수 있는 파일 점검 : find / -perm -2 -type f
  • 소유자가 없는 파일 점검 : find / -nouser -o -nogroup
  • umask : 새 파일 기본 권한. 022면 파일 644, 디렉터리 755가 된다.
  • chattr +i : 변경·삭제 금지(immutable), +a : 덧붙이기만 허용(append only). lsattr로 확인
  • ACL : setfacl, getfacl

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)는 쓰지 않는다.

파일 무결성과 점검 도구

편집 원본 편집
도구 용도
Tripwire 파일의 해시값을 데이터베이스로 저장해 두고 나중에 비교해 변조를 찾는다.
AIDE Tripwire와 비슷한 오픈소스 무결성 점검 도구. RHEL 기본 저장소에 있다.
rpm -Va 설치된 패키지 파일이 바뀌었는지 검사
md5sum, sha256sum 파일 해시값 계산
chkrootkit, rkhunter 루트킷 탐지
John the Ripper 비밀번호 강도 점검(크래킹)
nmap 열린 포트 점검
lynis 시스템 보안 설정 점검
  • PAM 모듈 타입 4가지와 제어 플래그 required·requisite·sufficient·optional의 차이
  • SetUID·SetGID 파일을 찾는 find 명령
  • SELinux 모드 3가지와 setenforce·getenforce
  • sshd_config의 PermitRootLogin, TCP Wrapper 파일 확인 순서
  • sudoers 형식과 visudo