Linux 비밀번호 정책 및 공격 탐지

CompTIABeginner
지금 연습하기

소개

이 랩에서는 강력한 비밀번호 정책을 구현하고 시행하여 Linux 시스템의 보안을 강화하는 필수 기술을 배우게 됩니다. 비밀번호 복잡성을 강제하는 시스템 전체 규칙을 구성하고, 최소 길이와 대문자, 소문자, 숫자와 같은 다양한 문자 유형의 조합을 요구합니다. 또한 비밀번호 만료 정책을 설정하여 자격 증명이 정기적으로 변경되도록 함으로써 핵심 시스템 구성 파일을 수정하여 손상된 비밀번호와 관련된 위험을 줄입니다.

정책 수립을 넘어, 새로운 사용자 계정에 이러한 강력한 비밀번호 요구 사항이 적용되도록 합니다. 그런 다음 랩은 사전 예방적 보안 조치에서 사후 탐지로 전환하여 시스템 인증 로그를 모니터링하는 방법을 배웁니다. 이러한 로그를 분석함으로써 반복적인 로그인 실패와 같이 의심스러운 활동을 식별할 수 있으며, 이는 무차별 대입 공격 또는 기타 무단 액세스 시도의 지표가 될 수 있습니다.

복잡성 및 만료 기간을 위한 로컬 Linux 암호 정책 구성

이 단계에서는 강력한 암호 정책을 구성하여 Linux 시스템의 보안을 강화하는 방법을 알아봅니다. 강력한 암호 정책은 **복잡성(complexity)**과 **만료 기간(age)**이라는 두 가지 중요한 측면을 시행하는 기본적인 보안 제어 기능입니다. 복잡성 규칙은 다양한 유형의 문자를 혼합하도록 요구하여 암호가 쉽게 추측되지 않도록 보장하며, 만료 기간 규칙은 사용자가 주기적으로 암호를 변경하도록 강제하여 자격 증명 유출 위험을 줄입니다. 표준 Linux 유틸리티를 사용하여 시스템 전체 구성 파일을 수정하고 이러한 정책을 적용할 것입니다.

먼저 암호 복잡성을 살펴보겠습니다. 최신 Debian 기반 시스템(예: Ubuntu)에서는 암호 품질이 pam_pwquality 모듈에 의해 관리됩니다. 이 모듈의 구성은 /etc/security/pwquality.conf 파일에 저장됩니다.

기본 설정을 확인하는 것부터 시작하겠습니다. cat 명령을 사용하여 구성 파일의 내용을 확인합니다. 출력을 더 깔끔하게 만들기 위해 주석 처리된 줄과 빈 줄을 필터링하기 위해 grep을 사용하겠습니다.

grep -vE '^#|^$' /etc/security/pwquality.conf

기본 설정이 표시되거나 파일에 활성 구성이 없을 수도 있습니다. 이제 더 강력한 정책을 시행하겠습니다. 관리자 권한으로 이 파일을 편집해야 하므로 nano 편집기와 함께 sudo를 사용하겠습니다.

sudo nano /etc/security/pwquality.conf

새 정책을 시행하기 위해 다음 줄을 파일에 추가합니다. 이 설정은 암호 길이가 최소 10자여야 하며, 최소한 하나의 숫자, 하나의 대문자, 하나의 소문자를 포함하도록 요구합니다.

minlen = 10
dcredit = -1
ucredit = -1
lcredit = -1

이 옵션들을 자세히 살펴보겠습니다.

  • minlen = 10: 암호의 최소 허용 길이를 10자로 설정합니다.
  • dcredit = -1: 최소한 하나의 숫자를 요구합니다. 음수 값은 "최소한 하나"를 의미합니다.
  • ucredit = -1: 최소한 하나의 대문자를 요구합니다.
  • lcredit = -1: 최소한 하나의 소문자를 요구합니다.

이 줄들을 추가한 후, Ctrl+X를 누른 다음 Y를 누르고 Enter를 눌러 파일을 저장하고 nano를 종료합니다.

이제 암호 만료 기간(aging) 구성을 살펴보겠습니다. 이 설정은 암호의 최대 및 최소 수명을 정의합니다. 새 사용자 계정에 대한 기본값은 /etc/login.defs에 저장됩니다.

grep을 사용하여 이 파일에서 관련 설정을 찾습니다.

grep -E 'PASS_MAX_DAYS|PASS_MIN_DAYS|PASS_WARN_AGE' /etc/login.defs

기본값을 보게 될 것이며, PASS_MAX_DAYS는 만료를 사실상 비활성화하기 위해 매우 높은 값으로 설정되어 있는 경우가 많습니다.

##       PASS_MAX_DAYS   Maximum number of days a password may be used.
PASS_MAX_DAYS   99999
##       PASS_MIN_DAYS   Minimum number of days allowed between password changes.
PASS_MIN_DAYS   0
##       PASS_WARN_AGE   Number of days warning is given before a password expires.
PASS_WARN_AGE   7

만료 기간을 9000일로 시행해 보겠습니다. sudo nano로 파일을 엽니다.

sudo nano /etc/login.defs

PASS_MAX_DAYS 줄을 찾아 값을 99999에서 9000으로 변경합니다. 사용자가 암호를 너무 자주 변경하는 것을 방지하기 위해 PASS_MIN_DAYS7로 설정할 수도 있습니다.

##       PASS_MAX_DAYS   Maximum number of days a password may be used.
PASS_MAX_DAYS   9000
##       PASS_MIN_DAYS   Minimum number of days allowed between password changes.
PASS_MIN_DAYS   7
##       PASS_WARN_AGE   Number of days warning is given before a password expires.
PASS_WARN_AGE   14

파일을 저장하고 nano를 종료합니다. /etc/login.defs의 이러한 설정은 이 변경 사항 이후에 생성된 사용자에게 적용됩니다. 기존 사용자(예: labex 사용자)에게 정책을 적용하려면 chage 명령을 사용합니다.

먼저 labex 사용자에 대한 현재 만료 기간 정보를 확인합니다.

sudo chage -l labex

출력에는 암호가 만료되지 않음(never expires)이 표시됩니다.

Last password change                                    : Jul 22, 2023
Password expires                                        : never
Password inactive                                       : never
Account expires                                         : never
Minimum number of days between password change          : 0
Maximum number of days between password change          : 99999
Number of days of warning before password expires       : 7

이제 -M 플래그와 함께 chage를 사용하여 labex 사용자에 대해 최대 일수를 9000으로 설정합니다.

sudo chage -M 9000 labex

사용자의 만료 기간 정보를 다시 확인하여 변경 사항을 검증합니다.

sudo chage -l labex

이제 Password expires 날짜가 업데이트되었고 최대 일수가 9000으로 설정되어 만료 기간 정책이 성공적으로 적용되었음을 확인할 수 있습니다.

Last password change                                    : Jul 22, 2023
Password expires                                        : Jan 01, 2048
Password inactive                                       : never
Account expires                                         : never
Minimum number of days between password change          : 0
Maximum number of days between password change          : 9000
Number of days of warning before password expires       : 7

이제 Linux 시스템에서 암호 복잡성 및 만료 기간 정책을 모두 성공적으로 구성했습니다.

새 사용자 계정에 강력한 비밀번호 적용

이 단계에서는 이전 단계에서 구성한 암호 복잡성 및 만료 정책이 새 사용자 계정에 적용되고 있는지 확인합니다. 이를 테스트하는 가장 좋은 방법은 새 사용자를 생성하고 규칙을 위반하는 암호를 설정해 보는 것입니다. 이를 통해 pam_pwquality 모듈과 시스템의 기본 설정이 함께 작동하여 계정이 생성되는 순간부터 새 계정을 보호하는 방식을 시연할 수 있습니다.

Debian 기반 시스템에서 사용자를 생성하기 위한 사용자 친화적인 대화형 스크립트인 adduser 명령을 사용하겠습니다. testuser라는 새 사용자를 생성해 보겠습니다.

sudo adduser testuser

시스템은 즉시 새 사용자의 암호를 설정하라는 메시지를 표시합니다. 여기서 우리의 정책이 테스트됩니다.

먼저, 정책을 위반하는 간단하고 약한 암호를 설정해 보겠습니다. 새 암호를 묻는 메시지가 표시되면 password를 입력하고 Enter를 누릅니다.

Adding user `testuser' ...
Adding new group `testuser' (1001) ...
Adding new user `testuser' (1001) with home directory `/home/testuser' ...
Copying files from `/etc/skel' ...
New password:

password가 우리의 규칙(너무 짧고 대문자나 숫자가 포함되어 있지 않음)을 위반하므로 시스템은 이를 거부합니다. 시스템이 제공하는 이유를 확인해 보겠습니다.

BAD PASSWORD: The password contains less than 1 digits

시스템은 숫자가 부족하다는 점을 지적하며 거부합니다. 여러 정책을 위반했지만, 이것이 보고하는 첫 번째 정책입니다.

시스템이 다시 한 번 메시지를 표시합니다. 이제 길이 요구 사항은 충족하지만 복잡성 규칙은 여전히 위반하는 암호를 시도해 보겠습니다. 12345를 입력하고 Enter를 누릅니다.

BAD PASSWORD: The password contains less than 1 uppercase letters
New password:

팁: 실수로 사용자를 생성한 경우 sudo deluser testuser를 사용하여 사용자를 삭제하고 다시 시도할 수 있습니다.

시스템이 다시 거부합니다. 이번에는 암호에 숫자가 부족하기 때문입니다. 또한 대문자도 부족하므로 복잡성 요구 사항을 충족하지 못합니다. 이제 모든 기준을 충족하는 암호를 제공해 보겠습니다. 메시지가 표시되면 StrongPass2025를 입력하고 Enter를 누릅니다. 확인을 위해 다시 입력하라는 메시지가 표시됩니다.

New password:
Retype new password:
passwd: password updated successfully

성공입니다! 시스템이 강력한 암호를 수락했습니다. 이제 사용자 추가 정보에 대한 질문을 할 것입니다. 기본값을 수락하려면 각 프롬프트에서 Enter를 누르기만 하면 됩니다.

Changing the user information for testuser
Enter the new value, or press ENTER for the default
        Full Name []:
        Room Number []:
        Work Phone []:
        Home Phone []:
        Other []:
Is the information correct? [Y/n] Y

이제 testuser 사용자가 생성되었습니다. id 명령을 사용하여 사용자가 존재하는지 확인할 수 있습니다.

id testuser

이는 사용자의 ID, 그룹 ID 및 그룹 멤버십을 표시합니다.

uid=1001(testuser) gid=1001(testuser) groups=1001(testuser)

다음으로, /etc/login.defs에서 설정한 암호 만료 정책이 이 새 사용자에게 자동으로 적용되었는지 확인해 보겠습니다. chage 명령을 사용하여 testuser의 만료 정보를 확인합니다.

sudo chage -l testuser

출력 결과는 Maximum number of days between password change가 우리가 구성한 대로 정확히 9000으로 설정되어 있음을 보여줍니다.

Last password change                                    : Jul 22, 2023
Password expires                                        : Jan 01, 2048
Password inactive                                       : never
Account expires                                         : never
Minimum number of days between password change          : 7
Maximum number of days between password change          : 9000
Number of days of warning before password expires       : 14

마지막으로 시스템을 정리하기 위해 테스트 사용자를 제거하겠습니다. deluser 명령은 사용자 계정을 제거합니다.

sudo deluser testuser

시스템은 사용자가 제거되었음을 확인합니다.

Removing user `testuser' ...
Warning: group `testuser' has no more members.
Done.

새 사용자를 성공적으로 생성하고, 암호 정책 적용을 테스트했으며, 기본 만료 규칙이 적용되었는지 확인했습니다.

로그인 실패 시도에 대한 인증 로그 모니터링

이 단계에서는 시스템 인증 로그를 모니터링하여 무차별 대입 공격과 같은 잠재적인 보안 위협을 탐지하는 방법을 배우게 됩니다. 시스템 관리의 핵심 부분은 의심스러운 활동에 대해 로그를 정기적으로 검토하는 것입니다. 실패한 로그인 시도는 무단 액세스 시도의 중요한 지표입니다. 실패한 로그인을 시뮬레이션한 다음 표준 Linux 명령을 사용하여 해당 로그 항목을 찾고 분석합니다.

Ubuntu 와 같은 Debian 기반 시스템에서는 인증 이벤트 (성공 및 실패 모두) 가 일반적으로 /var/log/auth.log 파일에 기록됩니다. 이 파일은 읽기 위해 관리자 권한이 필요합니다.

먼저 실패한 로그인 시도를 생성해 보겠습니다. su (substitute user) 명령을 사용하여 자신의 사용자 계정인 labex로 전환하려고 시도하지만 의도적으로 잘못된 비밀번호를 제공하여 안전하게 수행할 수 있습니다.

su labex

시스템에서 비밀번호를 묻는 메시지를 표시합니다. 잘못된 비밀번호 (예: wrongpassword) 를 입력하고 Enter를 누릅니다.

Password:
su: Authentication failure

실패 패턴을 만들기 위해 한 번 더 시도해 보겠습니다.

su labex

다시 잘못된 비밀번호를 입력합니다. 이제 일부 로그 데이터를 생성했으므로 인증 로그 파일을 검토해 보겠습니다. sudo와 함께 tail 명령을 사용하여 가장 최신 이벤트가 기록되는 /var/log/auth.log 파일의 마지막 몇 줄을 보겠습니다.

sudo tail /var/log/auth.log

실패한 su 시도와 관련된 몇 개의 새 줄이 표시됩니다. 출력은 타임스탬프, 프로세스 (su) 및 실패 메시지를 보여주는 이와 유사하게 표시됩니다.

Jul 22 16:45:01 labex-vm su[12345]: pam_unix(su:auth): authentication failure; logname=labex uid=1000 euid=0 tty=/dev/pts/0 ruser=labex rhost=  user=labex
Jul 22 16:45:01 labex-vm su[12345]: FAILED SU (to labex) labex on /dev/pts/0
Jul 22 16:45:15 labex-vm su[12346]: pam_unix(su:auth): authentication failure; logname=labex uid=1000 euid=0 tty=/dev/pts/0 ruser=labex rhost=  user=labex
Jul 22 16:45:15 labex-vm su[12346]: FAILED SU (to labex) labex on /dev/pts/0

수동으로 로그를 검색하는 것은 시간이 많이 걸릴 수 있습니다. 더 효율적인 방법은 grep을 사용하여 특정 키워드를 필터링하는 것입니다. "authentication failure"라는 모든 줄을 검색해 보겠습니다.

sudo grep "authentication failure" /var/log/auth.log

이 명령은 패턴과 일치하는 줄만 표시하므로 방금 생성한 실패한 시도를 쉽게 찾을 수 있습니다.

이제 이 모니터링 프로세스를 자동화하는 간단한 쉘 스크립트를 만들어 보겠습니다. 이 스크립트는 로그에서 실패를 확인하고 요약을 보고합니다. ~/project 디렉터리에서 nano를 사용하여 log_monitor.sh라는 새 파일을 만듭니다.

nano log_monitor.sh

편집기에 다음 Bash 스크립트를 입력합니다. 이 스크립트는 -c 플래그와 함께 grep을 사용하여 실패한 로그인 시도 횟수를 계산한 다음 상태 메시지를 출력합니다.

#!/bin/bash

LOG_FILE="/var/log/auth.log"
FAILURE_COUNT=$(sudo grep -c "authentication failure" $LOG_FILE)

echo "--- Authentication Log Monitor ---"
if [ "$FAILURE_COUNT" -gt 0 ]; then
  echo "WARNING: Found $FAILURE_COUNT failed login attempts."
else
  echo "OK: No failed login attempts found."
fi
echo "--------------------------------"

파일을 저장하고 Ctrl+X, Y, Enter를 눌러 nano를 종료합니다.

다음으로 chmod 명령을 사용하여 새 스크립트를 실행 가능하게 만듭니다.

chmod +x log_monitor.sh

마지막으로 모니터링 스크립트를 실행하여 결과를 확인합니다.

./log_monitor.sh

실패한 로그인을 생성했으므로 스크립트가 이를 감지하고 정확한 횟수와 함께 경고 메시지를 표시합니다.

--- Authentication Log Monitor ---
WARNING: Found 2 failed login attempts.
--------------------------------

이제 실패한 인증 시도를 시뮬레이션, 탐지 및 기본 모니터링 스크립트를 만드는 방법을 배웠으며, 이는 시스템 보안 유지에 중요한 기술입니다.

요약

이 실습에서는 강력한 로컬 비밀번호 정책을 구성하여 Linux 시스템 보안을 강화하는 방법을 배웠습니다. pam_pwquality 모듈을 사용하여 비밀번호 복잡성 규칙을 적용하기 위해 /etc/security/pwquality.conf 파일을 수정했습니다. 여기에는 최소 비밀번호 길이 설정과 추측하기 쉬운 자격 증명으로부터 보호하기 위해 최소 하나의 숫자, 하나의 대문자 및 하나의 소문자를 포함하도록 요구하는 것이 포함되었습니다.

또한 새 사용자 계정을 만들 때 이러한 강력한 비밀번호 정책이 적용되도록 하는 방법을 살펴보았습니다. 이 실습에서는 잠재적인 공격을 나타낼 수 있는 반복적인 로그인 실패 시도와 같은 보안 이벤트를 탐지하고 분석하기 위해 시스템 인증 로그를 모니터링하는 중요한 기술도 다루었습니다.