
Debian/Ubuntu 시스템을 CyberPatriot 대회에 맞게 강화하는 모듈식 Bash 툴킷으로, 계정, 방화벽, SSH, PAM 및 서비스 강화를 로깅 및 백업과 함께 자동화합니다.
대회 시간 압박 속에서 Debian/Ubuntu 계열 시스템을 하드닝하기 위한 모듈식 Bash 툴킷입니다. CyberPatriot National Youth Cyber Defense Competition의 여러 시즌에 걸쳐 구축 및 개선되었으며, 가장 최근에는 2025 준결승 라운드에서 Linux 부문 Platinum 티어에 입상했습니다.
이것은 범용 컴플라이언스 프레임워크가 아닙니다. 6시간의 시간 제한 실습을 위한 체크리스트 자동화 도구입니다. Linux 하드닝 패스의 스크립트로 처리 가능한 대부분을 정확하고, 빠르고, 멱등적으로 수행하고, 손댄 모든 것을 기록하며, 판단이 필요한 부분은 실행하는 사람에게 남겨둡니다.
CyberPatriot의 Linux 라운드는 상당히 예측 가능한 하드닝 단계 집합 -- 계정 위생, 비밀번호 정책, 방화벽 구성, 서비스 노출, 파일 권한, 패치 수준 -- 을 보상하는 루브릭에 대해 라이브 이미지를 채점하며, 이는 엄격한 시간 제한 아래에서, 보통 어떤 취약점이 심어졌는지 정확히 사전 통지 없이 이루어집니다. 그 체크리스트를 카운트다운 속에서 손으로 정확히 수행하는 것이 바로 팀이 알지 못하는 내용이 아니라 오타와 잊어버린 단계 때문에 쉬운 점수를 잃는 지점입니다.
이 툴킷은 바로 그런 압박 속에서 작성된 단일 모놀리식 스크립트로 시작했습니다. 이 저장소는 그 스크립트를 재작성한 것입니다. 동일한 체크리스트 커버리지를 유지하면서, 읽고, 테스트하고, 독립적으로 추론하기 더 쉬운 작은 단일 목적 모듈로 재구성했으며, 모든 비자명한 결정은 특정 CIS Benchmark 섹션이나 NIST SP 800-53 제어 항목에 연결되어 있습니다(보안 제어 및 참고 자료 참조).
flowchart TD
A[bin/harden.sh] --> B[lib/common.sh<br/>logging, backups, run wrapper]
A --> C[Service-role prompts<br/>or --config file]
A --> D[lib/packages.sh<br/>updates, attack-tool removal]
A --> E[lib/firewall.sh<br/>default-deny + ufw]
A --> F[lib/ssh.sh]
A --> G[lib/services.sh<br/>samba/ftp/mail/http/mysql/dns]
A --> H[lib/users.sh<br/>account review, hidden UID 0]
A --> I[lib/kernel.sh<br/>sysctl hardening]
A --> J[lib/pam.sh<br/>password policy, lockout]
A --> K[lib/filesystem.sh<br/>permissions, cron, banners]
A --> L[lib/monitoring.sh<br/>fail2ban, auditd, rkhunter]
A --> M[lib/forensics.sh<br/>baseline snapshot]
D & E & F & G & H & I & J & K & L & M --> N[(~/hardening-run/<br/>log + backups + baseline)]모든 모듈은 bin/harden.sh에 의해 소싱되며, 이 스크립트가 인자 파싱, 서비스 역할 설문, 실행 순서를 담당합니다. 모듈들은 서로를 직접 호출하지 않으며, 모든 모듈의 모든 상태 변경 명령은 lib/common.sh의 run() 래퍼를 거치므로, 프로젝트 전체가 드라이런 지원, 일관된 로깅, 치명적이지 않은 오류 처리를 구현할 단일 지점을 갖게 됩니다.
git clone <this-repo>
cd cyberpatriot-linux-hardening
sudo ./bin/harden.sh
머신의 역할(예: Samba, FTP, SSH, 웹 서버 등이 필요한지)에 대한 짧은 예/아니오 질문 시리즈가 표시된 다음, 위에 나열된 모듈을 통해 무인으로 실행됩니다. 로그, 타임스탬프가 찍힌 전체 설정 백업 세트, 시스템 베이스라인 스냅샷이 ~/hardening-run/에 기록됩니다.
실제 라운드에서는, 패키지별 확인 프롬프트를 건너뛰고 역할 질문에 실시간으로 입력하는 대신 준비된 답변 파일에서 답하십시오:
cp examples/config.env.example my-machine.env
# edit my-machine.env for this box's actual role
sudo ./bin/harden.sh --config my-machine.env --auto-approve
무엇이든 건드리기 전에 정확히 무엇을 할지 보고 싶으신가요?
sudo ./bin/harden.sh --dry-run --config my-machine.env
tools/find-port-owner.sh와 tools/list-nonstandard-users.sh는 같은 종류의 트리아지 작업을 위한 작은 독립 실행형 유틸리티로, 메인 스크립트와 독립적으로 사용할 수 있습니다 -- 사용법은 각 헤더를 참조하십시오.
보호해야 할 머신을 망가뜨리는 하드닝 스크립트는 시간 제한 라운드에서 쓸모없는 것보다 worse입니다. 몇 가지 기본값이 이를 반영하며, 무인으로 실행하기 전에 이해할 가치가 있습니다:
SSH_PASSWORD_AUTH=no), 여기서의 기본값은 아직 아무도 키를 프로비저닝하지 않았을 때 팀이 자기 머신에서 잠기는 것을 피하는 쪽을 선호합니다.INSTALL_CLAMAV, RUN_BASELINE_SCAN). 이는 이 스크립트가 할 수 있는 가장 느린 두 가지 작업이며, 둘 다 스스로 시스템 상태를 변경하지 않기 때문입니다. 체크리스트가 요구하거나 시간 여유가 있으면 켜십시오.~/hardening-run/baseline/listening_ports.txt를 참조하십시오.docs/security-controls.md를 참조하십시오.bin/harden.sh는 미리 답하지 않으면 머신의 서비스 역할에 대해 대화형으로 질문합니다. 프롬프트를 건너뛰려면 examples/config.env.example을 복사하고, 실제 역할을 채우고, --config로 전달하십시오. 파일에서 빠뜨린 변수는 대화형 프롬프트로 대체되므로, 부분적으로 채워진 설정 파일도 괜찮습니다.
sudo ./bin/harden.sh --config my-machine.env
플래그:
| 플래그 | 효과 |
|---|---|
--config FILE | env 파일에서 역할/정책 답변 로드 |
--dry-run | 취해질 모든 작업을 기록; 아무것도 변경하지 않음 |
--auto-approve | 패키지별 제거 확인 프롬프트 건너뛰기 |
.
├── bin/harden.sh orchestrator: parses args, asks role questions, runs modules in order
├── lib/
│ ├── common.sh logging, backups, idempotent file edits, the run() wrapper
│ ├── packages.sh updates, attack-tool removal
│ ├── ssh.sh SSH install/removal and hardening
│ ├── services.sh samba/ftp/telnet/mail/printing/mysql/http/dns
│ ├── firewall.sh ufw default-deny posture
│ ├── users.sh account review, hidden UID 0 / empty password detection
│ ├── kernel.sh sysctl hardening
│ ├── pam.sh password policy, account lockout
│ ├── filesystem.sh permissions, cron, rc.local, banners, anomaly scan
│ ├── monitoring.sh fail2ban, auditd, rkhunter, chkrootkit, ClamAV
│ └── forensics.sh read-only system baseline snapshot
├── tools/
│ ├── find-port-owner.sh resolve a listening TCP port to a process path
│ └── list-nonstandard-users.sh flag UID >= 1000 accounts not on an expected list
├── docs/
│ ├── security-controls.md every hardening decision, mapped to its source standard
│ └── editor-cheatsheet.md small editor commands worth remembering under pressure
├── examples/config.env.example annotated template for non-interactive runs
└── .github/workflows/shellcheck.yml lint on every push/PR
모든 스크립트는 GitHub Actions(.github/workflows/shellcheck.yml)를 통해 푸시 시 ShellCheck로 린트됩니다. PR을 열기 전에 로컬에서 확인하려면:
shellcheck lib/*.sh bin/*.sh tools/*.sh
bin/harden.sh --dry-run은 그 자체로도 테스트입니다: 파일시스템을 건드리거나 아무것도 설치하지 않고 모든 모듈의 제어 흐름과 로깅을 실행하며, 실제로 실행하기 전에 일회용 VM에 대해 변경 사항을 점검하는 가장 빠른 방법입니다. 새 모듈에 대한 전체 기대사항(멱등성, 파괴적 작업을 run()을 통해 라우팅, 모든 새 하드닝 단계에 대한 출처 인용)은 CONTRIBUTING.md를 참조하십시오.
모든 모듈의 헤더 주석과 docs/security-controls.md는 각 결정 뒤에 있는 특정 표준 섹션을 인용합니다. 전체에서 사용된 주요 출처:
참조된 탐지 도구(벤더링되지 않고 apt를 통해 설치됨):
fail2ban,
Linux Audit / auditd,
rkhunter,
chkrootkit. Lynis와 OpenSCAP은 후속 독립 감사로 권장되며, 이 프로젝트에 의해 자동으로 실행되지 않습니다.
각 항목 뒤의 전체 근거는 docs/security-controls.md를 참조하십시오.
MIT. LICENSE 참조.
| 모듈 | 하는 일 |
|---|
lib/packages.sh | 전체 시스템 업데이트; 비밀번호 크래커와 익스플로잇 도구를 자동으로 제거; 이중 용도 도구(nmap, Wireshark, netcat)와 레거시 서비스(VNC, NFS, telnet)는 제거 전에 검토 |
lib/firewall.sh | ufw를 통한 인바운드 기본 거부 / 아웃바운드 기본 허용, 그리고 알려진 흔한 백도어 포트에 대한 명시적 차단 |
lib/ssh.sh | 최신 cipher/KEX/MAC, root 로그인 금지, 연결 및 세션 제한 -- 또는 역할에 필요하지 않으면 SSH를 완전히 제거 |
lib/services.sh | Samba, FTP, 메일, 프린팅, MySQL, HTTP, DNS: 역할에 필요하면 각각 설치되고 최소한으로 하드닝되며, 필요하지 않으면 제거되고 방화벽으로 차단됨 |
lib/users.sh | 기존 계정에 대한 대화형 검토(관리자 권한, 삭제, 비밀번호 재설정), 숨겨진 UID-0 계정 및 빈 비밀번호 탐지 |
lib/kernel.sh | 네트워크 스택 및 커널 자기 보호 sysctl 설정(source routing, ICMP redirects, ASLR, ptrace scope, dmesg/kptr 제한) |
lib/pam.sh | pam_pwquality/pam_pwhistory를 통한 비밀번호 복잡도 및 이력, pam_faillock을 통한 계정 잠금, login.defs의 비밀번호 만료 |
lib/filesystem.sh | 핵심 파일 권한, cron/at 제한, 최소한의 rc.local, 법적 로그인 배너, 읽기 전용 SUID/전 세계 쓰기 가능/소유자 없는 파일 스캔 |
lib/monitoring.sh | 기본적으로 fail2ban 및 auditd; ClamAV와 전체 rkhunter/chkrootkit 스윕은 옵트인(대회 안전성 참고사항 참조) |
lib/forensics.sh | 나중 비교를 위한 사용자, 프로세스, 리스닝 포트, 설치된 패키지의 읽기 전용 스냅샷 |
| 표준 | 출처 |
|---|
| CIS Ubuntu Linux Benchmark | https://www.cisecurity.org/benchmark/ubuntu_linux |
| NIST SP 800-53 Rev. 5 | https://csrc.nist.gov/pubs/sp/800/53/r5/upd1/final |
| DISA STIG for Ubuntu | https://public.cyber.mil/stigs/downloads/ |
| Mozilla OpenSSH modern configuration guidelines | https://infosec.mozilla.org/guidelines/openssh |
| CyberPatriot National Youth Cyber Defense Competition | https://www.uscyberpatriot.org/ |