
이 Ansible 역할은 보안 관련 다양한 SSH 구성을 제공하여 전방위적인 기본 보호를 제공합니다.
주의: 이 역할은 hardening-collection으로 마이그레이션되었습니다:
이슈와 풀 리퀘스트는 해당 저장소에 열어 주세요!
network_ipv6_enable
ssh_listen_to도 IPv6 주소(예: [::])를 수신하도록 설정해야 합니다.ssh_server_ports
ssh_client_port
ssh_listen_to
ssh_host_key_files
ssh_host_key_algorithms
ssh_client_alive_interval
ssh_client_alive_count
ssh_permit_tunnel
ssh_remote_hosts
defaults/main.yml의 예시를 참조하세요.ssh_permit_root_login
without-password 또는 yes로 설정ssh_allow_tcp_forwarding
'no'. TCP 포워딩을 허용하려면 'yes'로 설정. OpenSSH >= 6.2 버전을 사용하는 경우 'yes', 'no', 'all' 또는 'local'을 지정할 수 있습니다. 'yes' 및 'no' 값은 따옴표와 함께 전달해야 합니다.ssh_gateway_ports
falsefalse. 와일드카드 주소에 바인딩을 강제하려면 true로 설정. 클라이언트가 바인딩할 주소를 지정하도록 허용하려면 clientspecified로 설정.ssh_allow_agent_forwarding
ssh_x11_forwarding
ssh_pam_support
ssh_use_pam
ssh_gssapi_support
ssh_kerberos_support
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
ssh_trusted_user_ca_keys_file이 설정된 경우에만 사용됩니다.ssh_authorized_principals
default_custom.yml을 참조하세요. ssh_authorized_principals_file이 설정된 경우에만 사용됩니다.ssh_print_motd
ssh_print_pam_motd
ssh_print_last_log
sftp_enabled
sftp_umask
sftp_chroot
sftp_chroot_dir
ssh_client_roaming
sshd_moduli_file
sshd_moduli_minimum
ssh_challengeresponseauthentication
ssh_client_password_login
truessh_server_password_login
truessh_banner
falsetruessh_banner_path
ssh_client_hardening
truefalsessh_client_port
'22'ssh_client_compression
falsessh_compression
falsessh_login_grace_time
30sssh_max_auth_retries
2ssh_max_sessions
10ssh_print_debian_banner
falsetruessh_server_enabled
truefalsessh_server_hardening
truefalsessh_server_match_address
ssh_server_match_group
ssh_server_match_user
ssh_server_match_local_port
ssh_server_permit_environment_vars
noyes는 ~/.ssh/environment 및 ~/.ssh/authorized_keys의 environment= 옵션이 sshd에 의해 처리되도록 지정합니다. openssh 버전 7.8 이상에서는 전역 "yes" 또는 "no" 설정 외에도 환경 변수 이름의 화이트리스트를 지정할 수 있습니다.ssh_server_accept_env_vars
ssh_use_dns
falsessh_server_revoked_keys
ssh_max_startups
ssh_macs
defaults/main.yml에 있습니다.ssh_kex
defaults/main.yml에 있습니다.ssh_ciphers
defaults/main.yml에 있습니다.ssh_custom_options
sshd_custom_options
sshd_syslog_facility
sshd_log_level
sshd_strict_modes
sshd_authenticationmethods
publickeydefaults/main.yml에 있습니다.위에 나열되지 않은 ssh 옵션을 구성하려면 ssh_custom_options (/etc/ssh/ssh_config용) 또는 sshd_custom_options (/etc/ssh/sshd_config용)를 사용하여 설정할 수 있습니다. 이러한 옵션은 파일의 시작 부분에 설정되므로 파일 아래쪽에서 옵션을 재정의할 수 있습니다.
플레이북 예시:
- 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 역할을 사용하는 것을 고려하세요.
- 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을 설치합니다:
# 의존성 설치
gem install bundler
bundle install
# 한 머신에서 빠른 테스트
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
# 한 머신에서 빠른 테스트
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을 참조하세요.
계정에 로그인할 수 없습니다. 클라이언트 키를 등록했는데도 로그인이 허용되지 않습니다.
일반적인 문제(방화벽, 네트워크, 키 누락, 잘못된 키, 계정 비활성화 등)를 모두 확인했다면 계정이 잠겨 있을 수 있습니다. 가장 빠른 확인 방법은 사용자의 비밀번호 해시를 확인하는 것입니다:
sudo grep myuser /etc/shadow
해시에 !가 포함되어 있으면 계정이 잠긴 것입니다:
myuser:!:16280:7:60:7:::
이 문제를 해결하는 올바른 방법은 계정을 잠금 해제하는 것입니다 (passwd -u myuser). 사용자에게 비밀번호가 없는 경우 다음을 통해 잠금을 해제할 수 있습니다:
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" 핸들러를 실행할 때 다음 오류가 발생하는 경우
Unable to restart service ssh: Failed to restart ssh.service: Access denied
또는
failure 1 running systemctl show for 'ssh': Failed to connect to bus: No such file or directory
플레이북을 root로 실행하거나 (플레이북 수준에서 become: yes 없이), 핸들러에 become: yes를 추가하세요.
이는 Ansible의 버그입니다: 자세한 내용은 여기 및 여기를 참조하세요.
기여자 가이드라인을 참조하세요.
Apache License, Version 2.0 (the "License")에 따라 라이선스가 부여됩니다. 이 파일은 라이선스를 준수하지 않는 한 사용할 수 없습니다. 라이선스 사본은 다음에서 얻을 수 있습니다.
http://www.apache.org/licenses/LICENSE-2.0
해당 법률에 의해 요구되거나 서면으로 동의하지 않는 한, 라이선스에 따라 배포되는 소프트웨어는 명시적이든 묵시적이든 어떠한 종류의 보증이나 조건 없이 "AS IS" 기준으로 배포됩니다. 라이선스에 따른 권한 및 제한 사항을 관리하는 특정 언어는 라이선스를 참조하세요.