John the Ripper 와 비밀번호 정책 적용

Kali LinuxBeginner
지금 연습하기

소개

오늘날 디지털 환경에서 강력한 비밀번호 정책은 민감한 정보를 보호하는 데 매우 중요합니다. 하지만 정책이 존재하더라도 취약점이 존재할 수 있습니다. 이 실습에서는 강력한 비밀번호 크래킹 도구인 John the Ripper 를 사용하여 기존 비밀번호 정책의 효과를 평가하는 과정을 안내합니다. 약점을 식별하고, 더 강력한 정책을 권장하며, 전반적인 보안을 강화하기 위해 자동화된 규정 준수 검사를 구현하는 방법을 배우게 됩니다. 이 실습 경험을 통해 비밀번호 보안 감사 및 시행에 대한 실질적인 기술을 습득할 수 있습니다.

기존 비밀번호 정책 분석

이 단계에서는 Linux 시스템에서 기존 비밀번호 정책을 분석하는 방법을 이해하는 것부터 시작합니다. 이 실습에서는 시스템 전체 정책을 직접 수정하지는 않겠지만, 이러한 정책이 어디에 구성되는지 이해하는 것은 감사에 매우 중요합니다. 비밀번호 복잡성, 만료 기간 및 잠금 설정을 결정하는 일반적인 구성 파일을 검토하는 데 중점을 둘 것입니다.

먼저 shadow 비밀번호 스위트 (shadow password suite) 에 대한 전역 구성 설정을 포함하는 /etc/login.defs 파일을 살펴보겠습니다. 이 파일은 비밀번호 만료 기간, 최소 비밀번호 길이 및 최대 비밀번호 만료 기간과 같은 매개변수를 정의합니다.

grep 명령을 사용하여 /etc/login.defs에서 비밀번호 관련 설정을 검색합니다.

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

값은 다를 수 있지만 다음과 유사한 출력을 볼 수 있습니다.

PASS_MAX_DAYS	99999
PASS_MIN_DAYS	0
PASS_WARN_AGE	7
ENCRYPT_METHOD SHA512

다음으로, 비밀번호 복잡성 규칙을 제어하는 PAM(Pluggable Authentication Modules) 구성 파일인 /etc/pam.d/common-password를 살펴보겠습니다. 이 파일에는 대소문자 혼합, 숫자 및 특수 문자 사용을 강제하는 pam_cracklib.so 또는 pam_pwquality.so와 같은 모듈이 포함되는 경우가 많습니다.

cat을 사용하여 /etc/pam.d/common-password 파일의 내용을 확인합니다.

cat /etc/pam.d/common-password

많은 줄이 표시되지만 pam_pwquality.so 또는 pam_cracklib.so와 해당 매개변수 (예: minlen, difok, ucredit, lcredit, dcredit, ocredit) 를 포함하는 줄에 주의를 기울이십시오.

password        [success=1 default=ignore]      pam_unix.so obscure sha512 shadow
password        requisite                       pam_pwquality.so retry=3 minlen=8 difok=3 reject_username enforce_for_root
password        optional                        pam_gnome_keyring.so
password        optional                        pam_kwallet.so
password        optional                        pam_systemd.so

마지막으로 pam_pwquality.so가 사용될 때 비밀번호 품질 설정에 대한 더 세분화된 제어를 제공하는 /etc/security/pwquality.conf 파일을 확인합니다.

cat /etc/security/pwquality.conf

minlen, dcredit, ucredit, lcredit, ocredit, maxrepeat 등의 설정을 볼 수 있습니다.

## Configuration for the pam_pwquality module
#
## The setting of the PAM module is usually in /etc/pam.d/common-password
#
## minlen = 8
## difok = 3
## dcredit = -1
## ucredit = -1
## lcredit = -1
## ocredit = -1
## minclass = 0
## maxrepeat = 0
## maxsequence = 0
## gecoscheck = 0
## dictcheck = 1
## usercheck = 1
## enforce_for_root

이러한 파일을 검토함으로써 시스템의 현재 비밀번호 정책 설정에 대한 좋은 이해를 얻을 수 있습니다.

John the Ripper 를 사용하여 정책 효과 테스트

이 단계에서는 John the Ripper(JtR) 를 사용하여 비밀번호 정책의 효과를 테스트합니다. 비밀번호 해시 파일에 접근할 수 있는 시나리오를 시뮬레이션하고 약한 비밀번호를 크랙해 보겠습니다.

먼저 시연 목적으로 더미 비밀번호 파일을 생성합니다. passwords.txt라는 이름의 파일에 몇 가지 약한 비밀번호를 포함하여 생성하겠습니다.

echo "user1:password123" > ~/project/passwords.txt
echo "user2:welcome" >> ~/project/passwords.txt
echo "user3:labexrocks" >> ~/project/passwords.txt

이제 이러한 일반 텍스트 비밀번호를 John the Ripper 가 이해할 수 있는 형식으로 변환해야 합니다. unshadow(JtR 의 구성 요소) 를 사용하여 더미 /etc/passwd/etc/shadow와 유사한 파일을 결합합니다. 단순화를 위해 크랙을 위해 JtR 의 stdin 모드와 passwords.txt 파일을 직접 사용하겠습니다.

John the Ripper 가 비밀번호를 크랙하는 데 사용할 wordlist.txt라는 간단한 단어 목록 파일을 생성해 보겠습니다.

echo "password123" > ~/project/wordlist.txt
echo "welcome" >> ~/project/wordlist.txt
echo "labexrocks" >> ~/project/wordlist.txt
echo "secret" >> ~/project/wordlist.txt
echo "123456" >> ~/project/wordlist.txt

이제 John the Ripper 를 사용하여 wordlist.txt를 사용하여 passwords.txt의 비밀번호를 크랙합니다.

john --format=raw-md5 --wordlist=~/project/wordlist.txt ~/project/passwords.txt

크랙된 비밀번호를 나타내는 다음과 유사한 출력을 볼 수 있습니다.

Using default input encoding: UTF-8
Loaded 3 password hashes with no different salts (Raw-MD5 [MD5])
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
password123 (user1)
welcome (user2)
labexrocks (user3)
3g 0:00:00:00 DONE (2023-10-27 08:30) 100.0% 3g/s 100.0p/s 100.0c/s 100.0C/s password123 welcome labexrocks
Session completed.

크랙된 비밀번호를 보려면 --show 옵션을 사용할 수 있습니다.

john --show ~/project/passwords.txt

출력:

user1:password123

user2:welcome

user3:labexrocks

3 password hashes cracked, 0 left

이를 통해 간단한 단어 목록을 사용하여 약한 비밀번호가 얼마나 쉽게 크랙될 수 있는지 알 수 있습니다.

비밀번호 정책의 허점 식별

이 단계에서는 이전 단계의 크랙 결과를 바탕으로 시뮬레이션된 비밀번호 정책의 허점을 식별합니다. John the Ripper 가 비밀번호를 쉽게 크랙할 수 있었다는 사실은 상당한 약점을 나타냅니다.

크랙된 비밀번호 (password123, welcome, labexrocks) 를 기반으로, 이들이 크랙될 수 있었던 몇 가지 일반적인 허점은 다음과 같습니다.

  1. 복잡성 요구 사항 부족: welcomelabexrocks 비밀번호는 간단한 사전 단어 또는 추측하기 쉬운 문구입니다. password123은 일반적인 패턴입니다. 강력한 정책은 대문자, 소문자, 숫자 및 특수 문자의 조합을 강제해야 합니다.
  2. 불충분한 길이: password123labexrocks는 각각 11 자 및 10 자이지만 단순성 때문에 여전히 취약합니다. 정책은 공격자의 검색 공간을 늘리기 위해 일반적으로 12 자 이상의 최소 길이를 강제해야 합니다.
  3. 사전 단어 검사 없음: 정책은 사용자가 일반적인 사전 단어나 간단한 변형을 선택하는 것을 방지하지 않았습니다.
  4. 일반 패턴 검사 없음: password123과 같은 비밀번호는 크랙 단어 목록에 자주 포함되는 예측 가능한 패턴을 따릅니다.
  5. 비밀번호 기록/재사용 방지 부족: 사용자가 이전 비밀번호를 재사용하도록 허용하면, 한때 강력했더라도 해당 이전 비밀번호가 유출되면 취약해집니다.

이러한 허점을 식별하는 것을 시뮬레이션하기 위해 더 강력한 비밀번호 정책이 어떻게 보일지 생각해 보겠습니다. 예를 들어, 현재 정책이 minlen=8을 허용하고 특정 문자 클래스 요구 사항이 없다면 welcome(7 자) 은 실패하지만 password123(11 자, 특수 문자 없음) 은 통과할 것입니다. 크랙 결과는 비밀번호가 기본 길이 요구 사항을 충족하더라도 복잡성 및 사전 검사가 강제되지 않으면 여전히 약할 수 있음을 강조합니다.

pam_pwquality.so 모듈 매개변수 (minlen, dcredit, ucredit, lcredit, ocredit, dictcheck 등) 를 조정하여 이러한 약한 비밀번호를 방지하는 방법을 생각해 보세요. 예를 들어, dcredit=-1을 설정하면 최소 하나 이상의 숫자가 필요하고, ucredit=-1은 대문자를 요구하는 식입니다.

이 단계는 주로 개념적인 것으로, 이전 크랙 연습의 결과를 분석하여 정책의 결함을 이해하는 데 중점을 둡니다.

더 강력한 비밀번호 정책 권장

이 단계에서는 식별된 허점을 기반으로 더 강력한 비밀번호 정책에 대한 권장 사항을 수립합니다. 효과적인 비밀번호 정책은 보안과 사용 편의성 간의 균형을 맞춥니다.

더 강력한 비밀번호 정책에 대한 몇 가지 권장 사항은 다음과 같습니다.

  1. 최소 길이: 최소 비밀번호 길이를 12~14 자 이상으로 늘립니다. 비밀번호가 길수록 크랙하기가 기하급수적으로 어려워집니다.
    • 예시 PAM 설정: /etc/security/pwquality.confminlen=12 또는 /etc/pam.d/common-passwordpam_pwquality.so minlen=12.
  2. 복잡성 요구 사항: 문자 유형의 조합 사용을 강제합니다.
    • 대문자 (A-Z)
    • 소문자 (a-z)
    • 숫자 (0-9)
    • 특수 문자 (!@#$%^&*()_+-=[]{}|;':",./<>?)
    • 예시 PAM 설정: /etc/security/pwquality.confdcredit=-1 ucredit=-1 lcredit=-1 ocredit=-1 또는 /etc/pam.d/common-passwordpam_pwquality.so dcredit=-1 ucredit=-1 lcredit=-1 ocredit=-1.
  3. 사전 및 일반 패턴 검사: 일반적인 사전 단어, 일반 이름 및 추측하기 쉬운 패턴 (password123, qwerty, 123456 등) 의 사용을 방지합니다.
    • 예시 PAM 설정: /etc/security/pwquality.confdictcheck=1 usercheck=1 또는 /etc/pam.d/common-passwordpam_pwquality.so dictcheck=1 usercheck=1.
  4. 비밀번호 기록/재사용 방지: 사용자가 이전 비밀번호 중 특정 개수를 재사용하는 것을 방지합니다. 이는 이전 비밀번호가 손상되었을 경우의 위험을 완화합니다.
    • 예시 PAM 설정: /etc/pam.d/common-passwordpam_unix.so와 함께 remember=5 사용 (예: password required pam_unix.so obscure sha512 shadow remember=5).
  5. 계정 잠금 정책: 특정 횟수의 로그인 실패 후 계정 잠금 정책을 구현하여 무차별 대입 공격을 억제합니다.
    • 예시 PAM 설정: /etc/pam.d/common-auth에서 pam_tally2.so 또는 pam_faillock.so 사용 (예: auth required pam_faillock.so deny=3 unlock_time=600).
  6. 정기적인 비밀번호 변경 (주의 필요): 전통적으로 권장되었지만, 빈번한 강제 비밀번호 변경은 사용자가 더 간단하고 예측 가능한 비밀번호를 선택하게 만들 수 있습니다. 더 나은 접근 방식은 강력한 복잡성과 길이를 강제하고, 침해가 의심되는 경우에만 변경을 요구하는 것입니다.

개념적인 변경을 시연하기 위해 정책을 업데이트한다고 가정해 보겠습니다. 실제 시스템 파일을 수정하지는 않겠지만, pwquality.conf 파일을 어떻게 편집할 수 있는지 볼 수 있습니다.

정책 권장 사항을 시뮬레이션하기 위해 더미 파일을 엽니다.

nano ~/project/recommended_policy.txt

파일에 다음 내용을 추가합니다.

## Recommended Password Policy Settings
minlen = 14
dcredit = -1
ucredit = -1
lcredit = -1
ocredit = -1
dictcheck = 1
usercheck = 1
maxrepeat = 3
maxsequence = 3

nano를 저장하고 종료합니다 (Ctrl+S, Ctrl+X).

이러한 설정은 최소 14 자 길이를 강제하고, 최소 하나의 숫자, 대문자, 소문자 및 특수 문자를 요구하며, 사전 단어와 사용자 이름을 방지합니다.

자동 정책 규정 준수 검사 구현

이 단계에서는 자동 정책 규정 준수 검사 구현에 대해 알아봅니다. 직접적인 시스템 전체 정책 적용은 PAM 및 기타 구성 파일을 통해 수행되지만, 자동 검사를 사용하여 정의된 정책에 대해 사용자 비밀번호 또는 시스템 구성을 정기적으로 감사할 수 있습니다.

이 실습에서는 쉘 스크립트를 사용하여 간단한 규정 준수 검사를 시뮬레이션합니다. 이 스크립트는 더미 사용자의 비밀번호가 특정 최소 길이 요구 사항을 충족하는지 확인합니다. 실제 시나리오에서는 이러한 스크립트가 더 복잡하며, OpenSCAP 과 같은 도구나 사용자 지정 스크립트와 통합하여 실제 비밀번호 해시 (허용되고 윤리적인 경우) 또는 구성 파일을 감사할 수 있습니다.

먼저 시스템 상태를 시뮬레이션하기 위해 더미 사용자 및 더미 비밀번호 해시 파일을 생성합니다. 실제 시스템 사용자는 생성하지 않습니다.

echo "testuser:\$6\$salt\$hashedpassword" > ~/project/dummy_shadow.txt

이제 dummy_shadow.txttestuser에 대한 비밀번호 길이가 특정 값 (예: 10 자) 보다 큰지 확인하는 check_password_compliance.sh라는 간단한 쉘 스크립트를 생성합니다.

nano ~/project/check_password_compliance.sh

스크립트에 다음 내용을 추가합니다.

#!/bin/bash

## This script simulates a basic password length compliance check.
## In a real scenario, you would parse actual shadow file entries
## or use more sophisticated tools.

MIN_LENGTH=10
PASSWORD_HASH=$(grep "testuser" ~/project/dummy_shadow.txt | cut -d':' -f2)

## For demonstration, we'll just check the length of a placeholder hash.
## In reality, you'd need to crack or analyze the actual hash.
## Here, we're just checking if the hash string itself is long enough,
## which is NOT how real password length checks work, but serves as a
## placeholder for a compliance check.

if [ ${#PASSWORD_HASH} -ge $MIN_LENGTH ]; then
  echo "Compliance Check: testuser password hash length meets minimum requirement ($MIN_LENGTH characters)."
  exit 0
else
  echo "Compliance Check: testuser password hash length DOES NOT meet minimum requirement ($MIN_LENGTH characters)."
  exit 1
fi

nano를 저장하고 종료합니다 (Ctrl+S, Ctrl+X).

스크립트를 실행 가능하게 만듭니다.

chmod +x ~/project/check_password_compliance.sh

이제 규정 준수 검사 스크립트를 실행합니다.

~/project/check_password_compliance.sh

더미 해시 길이에 따라 규정 준수를 나타내는 출력이 표시됩니다.

Compliance Check: testuser password hash length meets minimum requirement (10 characters).

이 간단한 예는 자동 규정 준수 검사의 개념을 보여줍니다. 프로덕션 환경에서는 cron을 사용하여 이러한 스크립트를 주기적으로 실행하도록 예약하여 비밀번호 정책 준수를 지속적으로 보장할 수 있습니다. 더 고급 검사에는 실제 비밀번호 해시 구문 분석 (허용되고 적절한 보안 고려 사항이 있는 경우), 사전 목록과의 비교 또는 보안 규정 준수 프레임워크와의 통합이 포함됩니다.

요약

이 실습에서는 비밀번호 정책 감사 및 적용에 대한 실질적인 경험을 쌓았습니다. /etc/login.defs, /etc/pam.d/common-password, /etc/security/pwquality.conf와 같은 주요 파일을 검토하여 Linux 시스템의 기존 비밀번호 정책 구성을 분석하는 방법을 배웠습니다. 그런 다음 John the Ripper 를 사용하여 약한 비밀번호가 얼마나 쉽게 크랙될 수 있는지 시연하여 강력한 정책의 중요성을 강조했습니다. 이러한 결과를 바탕으로 길이, 복잡성 및 사전 검사에 중점을 둔 더 강력한 비밀번호 정책에 대한 권장 사항을 수립했습니다. 마지막으로 비밀번호 정책 준수를 확인하는 간단한 스크립트를 만들어 자동 규정 준수 검사의 개념을 탐구했습니다. 이 실습은 비밀번호 보안 감사에 대한 기초적인 이해를 제공하며, 비밀번호 관련 취약점을 식별하고 완화하는 기술을 갖추게 합니다.