지금까지 우리는 리눅스와 윈도우 시스템의 권한, 로그, 악성코드 등 보안의 뼈대를 이루는 개념들을 살펴보았습니다.
그렇다면 실제 기업이나 공공기관에서는 이러한 시스템들을 어떻게 안전하게 관리하고 있을까요?
한국인터넷진흥원(
KISA
)은 국가의 중요한 전산망을 보호하기 위해
주요정보통신기반시설 기술적 취약점 분석 평가 가이드
를 배포하고 있습니다.
이 가이드는 실무 보안 담당자들이 시스템을 설정할 때 반드시 지켜야 하는 표준 체크리스트 역할을 합니다.
오늘은 리눅스(Unix) 서버 점검 항목 중 가장 기본이 되면서도 중요한
U-01
,
U-02
,
U-03
항목의 설정 방법을 직접 실습하며 알아보겠습니다.
서버를 관리할 때 터미널 장비 앞에서 직접 키보드를 두드리는 경우(Local 접속)보다, 자리에서 네트워크를 통해 원격으로 접속(SSH, Telnet)하는 경우가 훨씬 많습니다.
이때 시스템의 최고 관리자인
root
계정으로 직접 원격 접속을 허용하는 것은 보안상 매우 큰 위협이 됩니다.
공격자가 외부에서
root
계정의 비밀번호를 무차별 대입 공격으로 알아낸다면, 시스템의 모든 권한을 즉시 탈취당하게 됩니다.
따라서 일반 계정으로 먼저 원격 접속한 뒤,
su
명령어를 통해 관리자 권한으로 전환하는 이중 구조를 갖추어야 합니다.
원격 접속 서비스인
SSH
(Secure Shell)의 설정 파일인
sshd_config
를 수정하여
root
의 접근을 원천 차단합니다.
/etc/ssh/sshd_config # Authentication:
# LoginGraceTime 2m
# StrictModes yes
# [보안 설정] PermitRootLogin 값을 yes에서 no로 변경합니다.
PermitRootLogin no
# MaxAuthTries 6
# MaxSessions 10
설정 파일을 수정한 후에는 반드시 데몬을 재시작하여 변경 사항을 적용해야 합니다.
Terminal # SSH 데몬 재시작 명령어 (CentOS 7 이상)
sudo systemctl restart sshd
1.9편에서 배웠듯, 단순한 패스워드는 사전 대입 공격에 의해 순식간에 크래킹됩니다.
가이드에서는 사용자가 패스워드를 생성할 때, 반드시 일정 수준 이상의 복잡도를 갖추도록 시스템적으로 강제할 것을 요구합니다.
일반적으로 영문 대문자, 소문자, 숫자, 특수문자 중
3종류 이상을 섞어서 8자리 이상
, 또는
2종류 이상을 섞어서 10자리 이상
으로 설정해야 양호한 것으로 판단합니다.
최신 리눅스 환경에서는
pwquality.conf
파일을 통해 패스워드 복잡성을 세밀하게 제어할 수 있습니다.
Terminalsudo apt update
sudo apt install libpam-pwquality
/etc/security/pwquality.conf # 1. 패스워드 최소 길이 설정 (8자리 이상)
minlen = 8
# 2. 숫자 최소 요구 개수 (마이너스 값은 필수 포함을 의미함)
dcredit = -1
# 3. 소문자 최소 요구 개수
lcredit = -1
# 4. 특수문자 최소 요구 개수
ocredit = -1
위와 같이 설정하면, 사용자가 새로운 패스워드를 입력할 때 시스템이 조건을 검사하여 조건에 미달하면 저장을 거부하게 됩니다.
로그인 화면에서 비밀번호를 반복해서 틀릴 경우, 공격자의 무차별 대입 공격(Brute Force)일 확률이 높습니다.
이를 방어하기 위해 일정 횟수 이상 로그인을 실패하면 계정을 강제로 잠그는(Lock) 임계값이 설정되어 있어야 합니다.
임계값이 없다면 공격자는 비밀번호를 알아낼 때까지 수백만 번의 자동화된 공격을 시도할 수 있습니다.
리눅스의 사용자 인증을 담당하는 핵심 모듈인
PAM
(Pluggable Authentication Modules) 설정을 수정해야 합니다.
과거에는
pam_tally2
모듈을 썼지만, 최근에는 기능이 개선된
pam_faillock
모듈을 주로 사용합니다.
system-auth
파일과
password-auth
파일을 수정하여 정책을 적용합니다.
ubuntu에서는
common-auth
파일을 수정합니다.
/etc/pam.d/system-auth (common-auth) # 인증(auth) 단계에서 faillock 모듈을 호출합니다.
# deny=5 (5회 실패 시 잠금), unlock_time=600 (600초 후 자동 잠금 해제)
auth required pam_faillock.so preauth silent audit deny=5 unlock_time=600
# 성공한 경우에는 실패 기록을 초기화합니다.
auth[default=die] pam_faillock.so authsucc audit deny=5 unlock_time=600
이렇게 설정해두면, 공격자가 5번 연속으로 비밀번호를 틀릴 경우 10분 동안 해당 계정으로의 접속 시도 자체가 차단되어 시스템을 안전하게 보호할 수 있습니다.
앞서 살펴본 3가지 항목 외에도, 시스템 보안의 근간을 이루는 중요한 점검 항목들이 있습니다.
오늘은 실무 보안 점검의 표준 가이드라인을 바탕으로 주요 보안 설정 방법들을 실습해 보았습니다.
U-01 원격 접속 제한
sshd_config
파일에서 PermitRootLogin
을 no
로 변경하여 직접적인 root
접근을 막습니다.
U-02 복잡성 설정
pwquality.conf
파일에서 minlen
, dcredit
등의 옵션으로 안전한 패스워드 생성을 강제합니다.
U-03 잠금 임계값
PAM
모듈(pam_faillock.so
)을 활용하여 지정된 횟수 이상 로그인 실패 시 계정을 일정 시간 잠금 처리합니다.
이러한 설정들은 공격자의 침입을 지연시키고 차단하는 가장 기초적이면서도 강력한 방패입니다.
다음 시간에는 시스템 내부의 설정 방어선을 넘어, 네트워크 방화벽을 통해 불법적인 패킷을 걸러내는
1.13[실기] 리눅스 방화벽 iptables 정책 설정
에 대해 자세히 알아보겠습니다.