Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
ansible-ssh-hardening — 이 Ansible 역할은 보안 관련 다양한 SSH 구성을 제공하여 전방위적인 기본 보호를 제공합니다. | Kitploit
도구/GitHubGitHub/dev-sec/ansible-ssh-hardening
Cloud Infrastructure SecurityConfiguration AuditingNetwork SecurityDevSecOpsAuthenticationArchived
GitHubdev-sec/ansible-ssh-hardening

ansible-ssh-hardening

이 Ansible 역할은 보안 관련 다양한 SSH 구성을 제공하여 전방위적인 기본 보호를 제공합니다.

저장소 보기
7861905년 전Kitploit 검토 완료

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유
웹사이트

ssh-hardening (Ansible Role)

주의: 이 역할은 hardening-collection으로 마이그레이션되었습니다:

  • https://github.com/dev-sec/ansible-os-hardening/
  • https://galaxy.ansible.com/devsec/hardening

이슈와 풀 리퀘스트는 해당 저장소에 열어 주세요!

요구 사항

  • Ansible > 2.5

역할 변수

  • network_ipv6_enable
    • 기본값: false
    • 설명: IPv6가 필요한 경우 true. ssh_listen_to도 IPv6 주소(예: [::])를 수신하도록 설정해야 합니다.
  • ssh_server_ports
    • 기본값: ['22']
    • 설명: ssh-server가 수신해야 하는 포트
  • ssh_client_port
    • 기본값: '22'
    • 설명: ssh-client가 연결해야 하는 포트
  • ssh_listen_to
    • 기본값: ['0.0.0.0']
    • 설명: ssh-server가 수신해야 하는 하나 이상의 IP 주소. 기본값은 모든 IPv4 주소이지만, 보안상의 이유로 특정 주소로 구성해야 합니다!
  • ssh_host_key_files
    • 기본값: []
    • 설명: sshd용 호스트 키. 비어 있으면 설치된 sshd 버전이 지원하는 한 ['/etc/ssh/ssh_host_rsa_key', '/etc/ssh/ssh_host_ecdsa_key', '/etc/ssh/ssh_host_ed25519_key']가 사용됩니다.
  • ssh_host_key_algorithms
    • 기본값: []
    • 설명: 서버가 제공하는 호스트 키 알고리즘. 비어 있으면 기본 목록이 사용되고, 그렇지 않으면 지정된 알고리즘 목록으로 설정을 재정의합니다.
  • ssh_client_alive_interval
    • 기본값: 600
    • 설명: keepalive 메시지 전송 간격을 지정합니다.
  • ssh_client_alive_count
    • 기본값: 3
    • 설명: keep-alive 메시지가 전송되는 횟수를 정의합니다.
  • ssh_permit_tunnel
    • 기본값: false
    • 설명: SSH 포트 터널링이 필요한 경우 true
  • ssh_remote_hosts
    • 기본값: []
    • 설명: ssh-client용 사용자 지정 옵션을 가진 하나 이상의 호스트. 기본값은 비어 있습니다. defaults/main.yml의 예시를 참조하세요.
  • ssh_permit_root_login
    • 기본값: no
    • 설명: root 로그인 비활성화. root 로그인을 활성화하려면 without-password 또는 yes로 설정
  • ssh_allow_tcp_forwarding
    • 기본값: no
    • 설명: TCP 포워딩을 비활성화하려면 'no'. TCP 포워딩을 허용하려면 'yes'로 설정. OpenSSH >= 6.2 버전을 사용하는 경우 'yes', 'no', 'all' 또는 'local'을 지정할 수 있습니다.
      참고: 이 변수에 전달되는 값은 문자열이어야 하므로 'yes' 및 'no' 값은 따옴표와 함께 전달해야 합니다.
  • ssh_gateway_ports
    • 기본값: false
    • 설명: 포워딩된 포트를 non-loopback 주소에 바인딩하지 않으려면 false. 와일드카드 주소에 바인딩을 강제하려면 true로 설정. 클라이언트가 바인딩할 주소를 지정하도록 허용하려면 clientspecified로 설정.
  • ssh_allow_agent_forwarding
    • 기본값: false
    • 설명: 에이전트 포워딩을 비활성화하려면 false. 에이전트 포워딩을 허용하려면 true로 설정.
  • ssh_x11_forwarding
    • 기본값: false
    • 설명: X11 포워딩을 비활성화하려면 false. X11 포워딩을 허용하려면 true로 설정.
  • ssh_pam_support
    • 기본값: true
    • 설명: SSH에 PAM 지원이 있는 경우 true.
  • ssh_use_pam
    • 기본값: true
    • 설명: pam 인증을 비활성화하려면 false.
  • ssh_gssapi_support
    • 기본값: false
    • 설명: SSH에 GSSAPI 지원이 있는 경우 true.
  • ssh_kerberos_support
    • 기본값: true
    • 설명: SSH에 Kerberos 지원이 있는 경우 true.
  • ssh_deny_users
    • 기본값: ''
    • 설명: 지정된 경우 패턴 중 하나와 일치하는 사용자 이름의 로그인이 허용되지 않습니다.
  • ssh_allow_users
    • 기본값: ''
    • 설명: 지정된 경우 패턴 중 하나와 일치하는 사용자 이름만 로그인이 허용됩니다.
  • ssh_deny_groups
    • 기본값: ''
    • 설명: 지정된 경우 기본 그룹 또는 보조 그룹 목록이 패턴 중 하나와 일치하는 사용자의 로그인이 허용되지 않습니다.
  • ssh_allow_groups
    • 기본값: ''
    • 설명: 지정된 경우 기본 그룹 또는 보조 그룹 목록이 패턴 중 하나와 일치하는 사용자만 로그인이 허용됩니다.
  • ssh_authorized_keys_file
    • 기본값: ''
    • 설명: 사용자 인증에 사용할 수 있는 공개 키가 포함된 기본 파일을 변경합니다.
  • ssh_trusted_user_ca_keys_file
    • 기본값: ''
    • 설명: 사용자 인증서 서명에 사용되는 신뢰할 수 있는 인증 기관 공개 키가 포함된 파일을 지정합니다.
  • ssh_trusted_user_ca_keys
    • 기본값: []
    • 설명: 사용자 인증서 서명에 사용되는 신뢰할 수 있는 인증 기관 공개 키를 설정합니다. ssh_trusted_user_ca_keys_file이 설정된 경우에만 사용됩니다.
  • ssh_authorized_principals_file
    • 기본값: ''
    • 설명: 허용되는 principals가 포함된 파일을 지정합니다. ssh_trusted_user_ca_keys_file이 설정된 경우에만 사용됩니다.
  • ssh_authorized_principals
    • 기본값: []
    • 설명: 파일 경로와 허용된 principals를 포함하는 해시 목록. 모든 옵션은 default_custom.yml을 참조하세요. ssh_authorized_principals_file이 설정된 경우에만 사용됩니다.
  • ssh_print_motd
    • 기본값: false
    • 설명: MOTD 출력을 비활성화하려면 false
  • ssh_print_pam_motd
    • 기본값: false
    • 설명: pam을 통한 MOTD 출력을 비활성화하려면 false (Debian 및 Ubuntu)
  • ssh_print_last_log
    • 기본값: false
    • 설명: 마지막 로그인 정보 표시를 비활성화하려면 false
  • sftp_enabled
    • 기본값: false
    • 설명: sftp 구성을 활성화하려면 true
  • sftp_umask
    • 기본값: '0027'
    • 설명: sftp용 umask를 지정합니다.
  • sftp_chroot
    • 기본값: true
    • 설명: sftp용 chroot를 비활성화하려면 false
  • sftp_chroot_dir
    • 기본값: /home/%u
    • 설명: 기본 sftp chroot 위치를 변경합니다.
  • ssh_client_roaming
    • 기본값: false
    • 설명: 실험적인 클라이언트 로밍 활성화
  • sshd_moduli_file
    • 기본값: '/etc/ssh/moduli'
    • 설명: SSH moduli 파일 경로
  • sshd_moduli_minimum
    • 기본값: 2048
    • 설명: logjam을 완화하기 위해 정의된 크기보다 작은 Diffie-Hellman 매개변수를 제거합니다.
  • ssh_challengeresponseauthentication
    • 기본값: false
    • 설명: challenge-response 인증이 허용되는지 여부를 지정합니다 (예: PAM을 통해)
  • ssh_client_password_login
    • 기본값: false
    • 설명: ssh 클라이언트에서 비밀번호 기반 인증을 허용하려면 true
  • ssh_server_password_login
    • 기본값: false
    • 설명: ssh 서버에서 비밀번호 기반 인증을 허용하려면 true
  • ssh_banner
    • 기본값: false
    • 설명: 로그인 시 배너를 출력하려면 true
  • ssh_banner_path
    • 기본값: '/etc/sshd/banner.txt'
    • 설명: SSH 배너 파일 경로
  • ssh_client_hardening
    • 기본값: true
    • 설명: 클라이언트 하드닝을 중지하려면 false
  • ssh_client_port
    • 기본값: '22'
    • 설명: 원격 호스트에 연결할 포트 번호를 지정합니다.
  • ssh_client_compression
    • 기본값: false
    • 설명: 클라이언트가 압축을 요청하는지 여부를 지정합니다.
  • ssh_compression
    • 기본값: false
    • 설명: 사용자가 성공적으로 인증한 후 서버 측 압축이 활성화되는지 여부를 지정합니다.
  • ssh_login_grace_time
    • 기본값: 30s
    • 설명: SSH 서버에 대한 성공적인 인증에 허용되는 시간을 지정합니다.
  • ssh_max_auth_retries
    • 기본값: 2
    • 설명: 연결당 허용되는 최대 인증 시도 횟수를 지정합니다.
  • ssh_max_sessions
    • 기본값: 10
    • 설명: 주어진 연결에서 허용되는 최대 열린 세션 수를 지정합니다.
  • ssh_print_debian_banner
    • 기본값: false
    • 설명: debian 특정 배너를 출력하려면 true
  • ssh_server_enabled
    • 기본값: true
    • 설명: opensshd 서버를 비활성화하려면 false
  • ssh_server_hardening
    • 기본값: true
    • 설명: 서버 하드닝을 중지하려면 false
  • ssh_server_match_address
    • 기본값: ''
    • 설명: 조건부 블록을 도입합니다. Match 줄의 모든 기준이 충족되면 다음 줄의 키워드는 구성 파일의 전역 섹션에 설정된 값을 재정의하며, 다른 Match 줄이나 파일 끝까지 적용됩니다.
  • ssh_server_match_group
    • 기본값: ''
    • 설명: 조건부 블록을 도입합니다. Match 줄의 모든 기준이 충족되면 다음 줄의 키워드는 구성 파일의 전역 섹션에 설정된 값을 재정의하며, 다른 Match 줄이나 파일 끝까지 적용됩니다.
  • ssh_server_match_user
    • 기본값: ''
    • 설명: 조건부 블록을 도입합니다. Match 줄의 모든 기준이 충족되면 다음 줄의 키워드는 구성 파일의 전역 섹션에 설정된 값을 재정의하며, 다른 Match 줄이나 파일 끝까지 적용됩니다.
  • ssh_server_match_local_port
    • 기본값: ''
    • 설명: 조건부 블록을 도입합니다. Match 줄의 모든 기준이 충족되면 다음 줄의 키워드는 구성 파일의 전역 섹션에 설정된 값을 재정의하며, 다른 Match 줄이나 파일 끝까지 적용됩니다.
  • ssh_server_permit_environment_vars
    • 기본값: no
    • 설명: yes는 ~/.ssh/environment 및 ~/.ssh/authorized_keys의 environment= 옵션이 sshd에 의해 처리되도록 지정합니다. openssh 버전 7.8 이상에서는 전역 "yes" 또는 "no" 설정 외에도 환경 변수 이름의 화이트리스트를 지정할 수 있습니다.
  • ssh_server_accept_env_vars
    • 기본값: ''
    • 설명: 클라이언트가 보낸 환경 변수 중 세션의 환경에 복사될 변수를 지정합니다. 여러 환경 변수는 공백으로 구분할 수 있습니다.
  • ssh_use_dns
    • 기본값: false
    • 설명: sshd가 원격 호스트 이름을 조회하고 원격 IP 주소에 대해 확인된 호스트 이름이 동일한 IP 주소로 다시 매핑되는지 확인할지 여부를 지정합니다.
  • ssh_server_revoked_keys
    • 기본값: []
    • 설명: ssh 서버가 항상 거부하는 폐기된 공개 키 목록. 알려진 취약하거나 손상된 키를 폐기하는 데 유용합니다.
  • ssh_max_startups
    • 기본값: '10:30:100'
    • 설명: SSH 데몬에 대한 최대 동시 인증되지 않은 연결 수를 지정합니다.
  • ssh_macs
    • 기본값: []
    • 설명: macs를 재정의하려면 이 목록을 변경하세요. 기본값은 defaults/main.yml에 있습니다.
  • ssh_kex
    • 기본값: []
    • 설명: kexs를 재정의하려면 이 목록을 변경하세요. 기본값은 defaults/main.yml에 있습니다.
  • ssh_ciphers
    • 기본값: []
    • 설명: ciphers를 재정의하려면 이 목록을 변경하세요. 기본값은 defaults/main.yml에 있습니다.
  • ssh_custom_options
    • 기본값: []
    • 설명: SSH 클라이언트 구성을 위한 사용자 지정 줄
  • sshd_custom_options
    • 기본값: []
    • 설명: SSH 데몬 구성을 위한 사용자 지정 줄
  • sshd_syslog_facility
    • 기본값: 'AUTH'
    • 설명: sshd에서 메시지를 기록할 때 사용되는 facility 코드
  • sshd_log_level
    • 기본값: 'VERBOSE'
    • 설명: sshd에서 메시지를 기록할 때 사용되는 상세 수준
  • sshd_strict_modes
    • 기본값: true
    • 설명: 로그인을 수락하기 전에 사용자의 파일 모드와 소유권 및 홈 디렉터리를 확인합니다.
  • sshd_authenticationmethods
    • 기본값: publickey
    • 설명: 사용자에게 액세스 권한을 부여하기 위해 성공적으로 완료해야 하는 인증 방법을 지정합니다. 선택한 인증 방법에 필요한 모든 변수를 설정해야 합니다. 기본값은 defaults/main.yml에 있습니다.

역할 변수에 나열되지 않은 설정 구성

위에 나열되지 않은 ssh 옵션을 구성하려면 ssh_custom_options (/etc/ssh/ssh_config용) 또는 sshd_custom_options (/etc/ssh/sshd_config용)를 사용하여 설정할 수 있습니다. 이러한 옵션은 파일의 시작 부분에 설정되므로 파일 아래쪽에서 옵션을 재정의할 수 있습니다.

플레이북 예시:

root@kitploit:~
- hosts: localhost
  roles:
    - dev-sec.ssh-hardening
  vars:
    ssh_custom_options:
      - "Include /etc/ssh/ssh_config.d/*"
    sshd_custom_options:
      - "AcceptEnv LANG"

기본 포트 변경 및 멱등성

이 역할은 기본 포트 22 또는 인벤토리에 구성된 포트를 사용하여 서버에 연결합니다. ssh_server_ports를 통해 기본 ssh 포트가 변경되면 ssh 서버가 재시작된 후에도 이전 포트를 사용하여 연결을 시도합니다. 동일한 서버에서 이 역할을 다시 실행하려면 인벤토리를 새 ssh 포트로 업데이트해야 합니다.

멱등성이 중요한 경우, 구성된 포트에 연결할 수 없을 때 포트 22로 폴백하는 이 역할의 래퍼인 ssh-hardening-fallback 역할을 사용하는 것을 고려하세요.

플레이북 예시

root@kitploit:~
- hosts: localhost
  roles:
    - dev-sec.ssh-hardening

로컬 테스트

역할을 로컬에서 테스트하는 권장 방법은 Docker를 사용하는 것입니다. 시스템에 Docker를 설치해야 합니다. 시스템에 적합한 Docker 패키지는 Get started를 참조하세요.

vagrant와 Virtualbox 또는 VMWare를 사용하여 로컬에서 테스트를 실행할 수도 있습니다. 시스템에 Virtualbox와 Vagrant를 설치해야 합니다. 시스템에 적합한 vagrant 패키지는 Vagrant Downloads를 참조하세요. 모든 테스트에는 test-kitchen을 사용합니다. test-kitchen에 익숙하지 않다면 가이드를 참조하세요.

다음으로 test-kitchen을 설치합니다:

root@kitploit:~
# 의존성 설치
gem install bundler
bundle install

Docker로 테스트

root@kitploit:~
# 한 머신에서 빠른 테스트
bundle exec kitchen test ssh-ubuntu1804-ansible-latest

# 모든 머신에서 테스트
bundle exec kitchen test

# 개발용
bundle exec kitchen create ssh-ubuntu1804-ansible-latest
bundle exec kitchen converge ssh-ubuntu1804-ansible-latest
bundle exec kitchen verify ssh-ubuntu1804-ansible-latest

# 정리
bundle exec kitchen destroy ssh-ubuntu1804-ansible-latest

Virtualbox로 테스트

root@kitploit:~
# 한 머신에서 빠른 테스트
KITCHEN_YAML=".kitchen.vagrant.yml" bundle exec kitchen test ssh-ubuntu-1804

# 모든 머신에서 테스트
KITCHEN_YAML=".kitchen.vagrant.yml" bundle exec kitchen test

# 개발용
KITCHEN_YAML=".kitchen.vagrant.yml" bundle exec kitchen create ssh-ubuntu-1804
KITCHEN_YAML=".kitchen.vagrant.yml" bundle exec kitchen converge ssh-ubuntu-1804

자세한 내용은 test-kitchen을 참조하세요.

FAQ / 함정

계정에 로그인할 수 없습니다. 클라이언트 키를 등록했는데도 로그인이 허용되지 않습니다.

일반적인 문제(방화벽, 네트워크, 키 누락, 잘못된 키, 계정 비활성화 등)를 모두 확인했다면 계정이 잠겨 있을 수 있습니다. 가장 빠른 확인 방법은 사용자의 비밀번호 해시를 확인하는 것입니다:

root@kitploit:~
sudo grep myuser /etc/shadow

해시에 !가 포함되어 있으면 계정이 잠긴 것입니다:

root@kitploit:~
myuser:!:16280:7:60:7:::

이 문제를 해결하는 올바른 방법은 계정을 잠금 해제하는 것입니다 (passwd -u myuser). 사용자에게 비밀번호가 없는 경우 다음을 통해 잠금을 해제할 수 있습니다:

root@kitploit:~
usermod -p "*" myuser

또는 PAM을 사용하려는 경우 ssh_use_pam: true로 활성화했습니다. PAM은 잠긴 사용자가 키로 로그인할 수 있게 허용합니다.

내 애플리케이션이 더 이상 SSH로 연결되지 않는 이유는 무엇인가요?

항상 먼저 로그 파일을 확인하고 가능하면 연결 시 완료되는 클라이언트와 서버 간의 협상을 확인하세요.

python 및 ruby 기반 애플리케이션에서 오래된 암호화 세트를 사용하여 발생하는 일부 문제를 확인했습니다. 이는 이 하드닝 모듈이 암호, 메시지 인증 코드(MAC) 및 키 교환(KEX) 알고리즘 목록을 더 안전한 선택으로 축소했기 때문에 충돌이 발생합니다.

역할을 사용한 후 Ansible의 template/copy/file 모듈이 더 이상 작동하지 않습니다!

이 역할은 기본적으로 SFTP를 비활성화합니다. Ansible은 기본적으로 SFTP를 사용하여 원격 호스트로 파일을 전송합니다. ansible.cfg에서 scp_if_ssh = True를 설정해야 합니다. 이렇게 하면 Ansible이 SCP를 사용하여 파일을 복사합니다. 또는 sftp_enabled를 true로 설정하여 SFTP를 다시 활성화할 수 있습니다.

권한 부족으로 sshd 서비스를 재시작할 수 없습니다.

"restart sshd" 핸들러를 실행할 때 다음 오류가 발생하는 경우

root@kitploit:~
Unable to restart service ssh: Failed to restart ssh.service: Access denied

또는

root@kitploit:~
failure 1 running systemctl show for 'ssh': Failed to connect to bus: No such file or directory

플레이북을 root로 실행하거나 (플레이북 수준에서 become: yes 없이), 핸들러에 become: yes를 추가하세요.

이는 Ansible의 버그입니다: 자세한 내용은 여기 및 여기를 참조하세요.

기여

기여자 가이드라인을 참조하세요.

라이선스 및 작성자

  • 작성자:: Sebastian Gumprich
  • 작성자:: Christoph Hartmann [email protected]

Apache License, Version 2.0 (the "License")에 따라 라이선스가 부여됩니다. 이 파일은 라이선스를 준수하지 않는 한 사용할 수 없습니다. 라이선스 사본은 다음에서 얻을 수 있습니다.

root@kitploit:~
http://www.apache.org/licenses/LICENSE-2.0

해당 법률에 의해 요구되거나 서면으로 동의하지 않는 한, 라이선스에 따라 배포되는 소프트웨어는 명시적이든 묵시적이든 어떠한 종류의 보증이나 조건 없이 "AS IS" 기준으로 배포됩니다. 라이선스에 따른 권한 및 제한 사항을 관리하는 특정 언어는 라이선스를 참조하세요.

도구 다운로드