dev-sec.ssh-hardening
Wzmocnienie SSH (Rola Ansible)
Uwaga: Ta rola została przeniesiona do naszej kolekcji wzmocnień:
Proszę zgłaszać wszelkie problemy i pull requesty tam!
Wymagania
- Ansible > 2.5
Zmienne Roli
network_ipv6_enable
- Domyślnie: fałsz
- Opis: prawda, jeśli IPv6 jest potrzebne.
ssh_listen_to
musi być również ustawione na słuchanie adresów IPv6 (np.[::]
).
ssh_server_ports
- Domyślnie: ['22']
- Opis: porty, na których serwer SSH powinien nasłuchiwać.
ssh_client_port
- Domyślnie: '22'
- Opis: port, do którego klient SSH powinien się łączyć.
ssh_listen_to
- Domyślnie: ['0.0.0.0']
- Opis: jeden lub więcej adresów IP, na które serwer SSH powinien nasłuchiwać. Domyślnie są to wszystkie adresy IPv4, ale powinny być skonfigurowane na konkretne adresy w celach bezpieczeństwa.
ssh_host_key_files
- Domyślnie: []
- Opis: Klucze hosta dla sshd. Jeśli puste, użyte będą ['/etc/ssh/ssh_host_rsa_key', '/etc/ssh/ssh_host_ecdsa_key', '/etc/ssh/ssh_host_ed25519_key'], o ile są wspierane przez zainstalowaną wersję sshd.
ssh_host_key_algorithms
- Domyślnie: []
- Opis: Algorytmy kluczy hosta oferowane przez serwer. Jeśli puste, użyta zostanie domyślna lista, w przeciwnym razie zaktualizuje ustawienie z określoną listą algorytmów.
ssh_client_alive_interval
- Domyślnie: 600
- Opis: określa interwał wysyłania wiadomości keepalive.
ssh_client_alive_count
- Domyślnie: 3
- Opis: definiuje, jak często wysyłane są wiadomości keep-alive.
ssh_permit_tunnel
- Domyślnie: fałsz
- Opis: prawda, jeśli wymagane jest tunelowanie portów SSH.
ssh_remote_hosts
- Domyślnie: []
- Opis: jeden lub więcej hostów i ich niestandardowe opcje dla klienta SSH. Domyślnie puste. Zobacz przykłady w
defaults/main.yml
.
ssh_permit_root_login
- Domyślnie: nie
- Opis: Wyłącza logowanie jako root. Ustaw na
without-password
lubyes
, aby włączyć logowanie jako root.
ssh_allow_tcp_forwarding
- Domyślnie: nie
- Opis:
'nie'
dla wyłączenia przekazywania TCP. Ustaw na'tak'
, aby zezwolić na przekazywanie TCP. Jeśli używasz wersji OpenSSH >= 6.2, możesz określić'yes'
,'no'
,'all'
lub'local'
.
Uwaga: wartości przekazywane do tej zmiennej muszą być ciągami, więc wartości'yes'
i'no'
powinny być przekazywane w cudzysłowach.
ssh_gateway_ports
- Domyślnie:
fałsz
- Opis:
fałsz
, aby wyłączyć powiązanie przekazywanych portów do adresów nie-przełączających. Ustaw naprawda
, aby wymusić powiązanie na adresie dzikiej karty. Ustaw naclientspecified
, aby pozwolić klientowi określić, do którego adresu ma się powiązać.
- Domyślnie:
ssh_allow_agent_forwarding
- Domyślnie: fałsz
- Opis: fałsz, aby wyłączyć przekazywanie agenta. Ustaw na prawda, aby zezwolić na przekazywanie agenta.
ssh_x11_forwarding
- Domyślnie: fałsz
- Opis: fałsz, aby wyłączyć przekazywanie X11. Ustaw na prawda, aby zezwolić na przekazywanie X11.
ssh_pam_support
- Domyślnie: prawda
- Opis: prawda, jeśli SSH ma wsparcie PAM.
ssh_use_pam
- Domyślnie: prawda
- Opis: fałsz, aby wyłączyć uwierzytelnianie PAM.
ssh_gssapi_support
- Domyślnie: fałsz
- Opis: prawda, jeśli SSH ma wsparcie GSSAPI.
ssh_kerberos_support
- Domyślnie: prawda
- Opis: prawda, jeśli SSH ma wsparcie Kerberos.
ssh_deny_users
- Domyślnie: ''
- Opis: jeśli określone, logowanie jest zabronione dla nazw użytkowników, które pasują do jednego z wzorców.
ssh_allow_users
- Domyślnie: ''
- Opis: jeśli określone, logowanie jest dozwolone tylko dla nazw użytkowników, które pasują do jednego z wzorców.
ssh_deny_groups
- Domyślnie: ''
- Opis: jeśli określone, logowanie jest zabronione dla użytkowników, których grupa podstawowa lub grupy pomocnicze pasują do jednego z wzorców.
ssh_allow_groups
- Domyślnie: ''
- Opis: jeśli określone, logowanie jest dozwolone tylko dla użytkowników, których grupa podstawowa lub grupy pomocnicze pasują do jednego z wzorców.
ssh_authorized_keys_file
- Domyślnie: ''
- Opis: zmienia domyślny plik, który zawiera klucze publiczne, które mogą być używane do uwierzytelniania użytkowników.
ssh_trusted_user_ca_keys_file
- Domyślnie: ''
- Opis: określa plik zawierający zaufane klucze publiczne certyfikacyjnych urzędów, używane do podpisywania certyfikatów użytkowników.
ssh_trusted_user_ca_keys
- Domyślnie: []
- Opis: ustawia zaufane klucze publiczne certyfikacyjnych urzędów, używane do podpisywania certyfikatów użytkowników. Używane tylko wtedy, gdy
ssh_trusted_user_ca_keys_file
jest ustawione.
ssh_authorized_principals_file
- Domyślnie: ''
- Opis: określa plik zawierający zasady, które są dozwolone. Używane tylko wtedy, gdy
ssh_trusted_user_ca_keys_file
jest ustawione.
ssh_authorized_principals
- Domyślnie: []
- Opis: lista haszowanych zawierających ścieżki plików i dozwolone zasady, zobacz
default_custom.yml
dla wszystkich opcji. Używane tylko wtedy, gdyssh_authorized_principals_file
jest ustawione.
ssh_print_motd
- Domyślnie: fałsz
- Opis: fałsz, aby wyłączyć wyświetlanie komunikatu powitalnego (MOTD).
ssh_print_pam_motd
- Domyślnie: fałsz
- Opis: fałsz, aby wyłączyć wyświetlanie komunikatu powitalnego (MOTD) przez PAM (Debian i Ubuntu).
ssh_print_last_log
- Domyślnie: fałsz
- Opis: fałsz, aby wyłączyć wyświetlanie informacji o ostatnim logowaniu.
sftp_enabled
- Domyślnie: fałsz
- Opis: prawda, aby włączyć konfigurację sftp.
sftp_umask
- Domyślnie: '0027'
- Opis: Określa umask dla sftp.
sftp_chroot
- Domyślnie: prawda
- Opis: fałsz, aby wyłączyć chroot dla sftp.
sftp_chroot_dir
- Domyślnie: /home/%u
- Opis: zmienia domyślną lokalizację chroot sftp.
ssh_client_roaming
- Domyślnie: fałsz
- Opis: włącza eksperymentalne roaming klienta.
sshd_moduli_file
- Domyślnie: '/etc/ssh/moduli'
- Opis: ścieżka do pliku SSH moduli.
sshd_moduli_minimum
- Domyślnie: 2048
- Opis: usuwa parametry Diffie-Hellman mniejsze niż zdefiniowany rozmiar, aby złagodzić logjam.
ssh_challengeresponseauthentication
- Domyślnie: fałsz
- Opis: Określa, czy dozwolone jest uwierzytelnianie za pomocą challenge-response (np. przez PAM).
ssh_client_password_login
- Domyślnie: fałsz
- Opis:
prawda
, aby zezwolić na uwierzytelnianie oparte na hasłach z klientem SSH.
ssh_server_password_login
- Domyślnie: fałsz
- Opis:
prawda
, aby zezwolić na uwierzytelnianie oparte na hasłach z serwerem SSH.
ssh_banner
- Domyślnie:
fałsz
- Opis:
prawda
, aby wyświetlić baner przy logowaniu.
- Domyślnie:
ssh_banner_path
- Domyślnie: '/etc/sshd/banner.txt'
- Opis: ścieżka do pliku banera SSH.
ssh_client_hardening
- Domyślnie:
prawda
- Opis:
fałsz
, aby zatrzymać wzmocnienie klienta.
- Domyślnie:
ssh_client_port
- Domyślnie:
'22'
- Opis: Określa numer portu do połączenia na zdalnym hoście.
- Domyślnie:
ssh_client_compression
- Domyślnie:
fałsz
- Opis: Określa, czy klient żąda kompresji.
- Domyślnie:
ssh_compression
- Domyślnie:
fałsz
- Opis: Określa, czy kompresja po stronie serwera jest włączona po pomyślnym uwierzytelnieniu użytkownika.
- Domyślnie:
ssh_login_grace_time
- Domyślnie:
30s
- Opis: określa czas dozwolony na pomyślne uwierzytelnienie do serwera SSH.
- Domyślnie:
ssh_max_auth_retries
- Domyślnie:
2
- Opis: Określa maksymalną liczbę prób uwierzytelnienia dozwoloną na pojedyncze połączenie.
- Domyślnie:
ssh_max_sessions
- Domyślnie:
10
- Opis: Określa maksymalną liczbę otwartych sesji dozwoloną z danego połączenia.
- Domyślnie:
ssh_print_debian_banner
- Domyślnie:
fałsz
- Opis:
prawda
, aby wyświetlić baner specyficzny dla Debiana.
- Domyślnie:
ssh_server_enabled
- Domyślnie:
prawda
- Opis:
fałsz
, aby wyłączyć serwer opensshd.
- Domyślnie:
ssh_server_hardening
- Domyślnie:
prawda
- Opis:
fałsz
, aby zatrzymać wzmocnienie serwera.
- Domyślnie:
ssh_server_match_address
- Domyślnie: ''
- Opis: Wprowadza blok warunkowy. Jeśli wszystkie kryteria w linii Match są spełnione, słowa kluczowe w kolejnych liniach nadpisują te ustalone w globalnej sekcji pliku konfiguracyjnego, aż do kolejnej linii Match lub końca pliku.
ssh_server_match_group
- Domyślnie: ''
- Opis: Wprowadza blok warunkowy. Jeśli wszystkie kryteria w linii Match są spełnione, słowa kluczowe w kolejnych liniach nadpisują te ustalone w globalnej sekcji pliku konfiguracyjnego, aż do kolejnej linii Match lub końca pliku.
ssh_server_match_user
- Domyślnie: ''
- Opis: Wprowadza blok warunkowy. Jeśli wszystkie kryteria w linii Match są spełnione, słowa kluczowe w kolejnych liniach nadpisują te ustalone w globalnej sekcji pliku konfiguracyjnego, aż do kolejnej linii Match lub końca pliku.
ssh_server_match_local_port
- Domyślnie: ''
- Opis: Wprowadza blok warunkowy. Jeśli wszystkie kryteria w linii Match są spełnione, słowa kluczowe w kolejnych liniach nadpisują te ustalone w globalnej sekcji pliku konfiguracyjnego, aż do kolejnej linii Match lub końca pliku.
ssh_server_permit_environment_vars
- Domyślnie:
nie
- Opis:
tak
, aby określić, że ~/.ssh/environment i opcje environment= w ~/.ssh/authorized_keys są przetwarzane przez sshd. W wersji openssh 7.8 możliwe jest określenie listy dozwolonych nazw zmiennych środowiskowych obok globalnych ustawień "tak" lub "nie".
- Domyślnie:
ssh_server_accept_env_vars
- Domyślnie: ''
- Opis: Określa, które zmienne środowiskowe wysyłane przez klienta będą kopiowane do środowiska sesji, wiele zmiennych środowiskowych może być oddzielonych białymi znakami.
ssh_use_dns
- Domyślnie:
fałsz
- Opis: Określa, czy sshd powinien sprawdzać nazwę zdalnego hosta i upewnić się, że zresolved host name dla zdalnego adresu IP wskazuje z powrotem na ten sam adres IP.
- Domyślnie:
ssh_server_revoked_keys
- Domyślnie: []
- Opis: lista odrzuconych kluczy publicznych, które serwer ssh zawsze odrzuci, przydatna do unieważnienia znanych słabych lub skompromitowanych kluczy.
ssh_max_startups
- Domyślnie: '10:30:100'
- Opis: Określa maksymalną liczbę równoległych nieautoryzowanych połączeń do demona SSH.
ssh_macs
- Domyślnie: []
- Opis: Zmień tę listę, aby nadpisać macs. Domyślnie znajdziesz je w
defaults/main.yml
.
ssh_kex
- Domyślnie: []
- Opis: Zmień tę listę, aby nadpisać kexs. Domyślnie znajdziesz je w
defaults/main.yml
.
ssh_ciphers
- Domyślnie: []
- Opis: Zmień tę listę, aby nadpisać szyfry. Domyślnie znajdziesz je w
defaults/main.yml
.
ssh_custom_options
- Domyślnie: []
- Opis: Niestandardowe linie dla konfiguracji klienta SSH.
sshd_custom_options
- Domyślnie: []
- Opis: Niestandardowe linie dla konfiguracji demona SSH.
sshd_syslog_facility
- Domyślnie: 'AUTH'
- Opis: Kod urządzenia używany do rejestrowania wiadomości z sshd.
sshd_log_level
- Domyślnie: 'VERBOSE'
- Opis: Poziom szczegółowości używany do rejestrowania wiadomości z sshd.
sshd_strict_modes
- Domyślnie: prawda
- Opis: Sprawdza tryby plików i właścicieli plików użytkownika oraz katalogu domowego przed akceptacją logowania.
sshd_authenticationmethods
- Domyślnie:
publickey
- Opis: Określa metody uwierzytelniania, które muszą zostać pomyślnie zrealizowane, aby użytkownik miał dostęp. Upewnij się, że ustawiono wszystkie wymagane zmienne dla wybranej metody uwierzytelniania. Domyślnie znajdziesz je w
defaults/main.yml
.
- Domyślnie:
Konfigurowanie ustawień nie wymienionych w zmiennych roli
Jeśli chcesz skonfigurować opcje ssh, które nie są wymienione powyżej, możesz użyć ssh_custom_options
(dla /etc/ssh/ssh_config
) lub sshd_custom_options
(dla /etc/ssh/sshd_config
), aby je ustawić. Te opcje zostaną ustawione na początku pliku, abyś mógł nadpisać opcje dalej w pliku.
Przykład playbooka:
- hosts: localhost
roles:
- dev-sec.ssh-hardening
vars:
ssh_custom_options:
- "Include /etc/ssh/ssh_config.d/*"
sshd_custom_options:
- "AcceptEnv LANG"
Zmiana domyślnego portu i idempotencja
Ta rola używa domyślnego portu 22 lub portu skonfigurowanego w inwentarzu do połączenia z serwerem. Jeśli domyślny port ssh
zostanie zmieniony za pomocą ssh_server_ports
, po ponownym uruchomieniu serwera SSH, wciąż będzie próbował połączyć się z poprzednim portem. Aby ponownie uruchomić tę rolę na tym samym serwerze, inwentarz będzie musiał zostać zaktualizowany, aby używał nowego portu ssh.
Jeśli idempotencja jest ważna, rozważ użycie roli ssh-hardening-fallback
, która jest wrapperem wokół tej roli, który wraca do portu 22, jeśli skonfigurowany port jest niedostępny.
Przykładowy Playbook
- hosts: localhost
roles:
- dev-sec.ssh-hardening
Testowanie lokalne
Preferowany sposób lokalnego testowania roli to użycie Dockera. Musisz zainstalować Dockera na swoim systemie. Zobacz Rozpocznij odpowiedni pakiet Dockera dla twojego systemu.
Możesz także użyć Vagranta i VirtualBoxa lub VMWare do lokalnego testowania. Musisz zainstalować VirtualBox i Vagranta na swoim systemie. Zobacz Pobieranie Vagranta odpowiedni pakiet Vagranta dla twojego systemu. W przypadku wszystkich naszych testów używamy test-kitchen
. Jeśli nie jesteś zaznajomiony z test-kitchen
, zapoznaj się z ich przewodnikiem.
Następnie zainstaluj test-kitchen:
# Zainstaluj zależności
gem install bundler
bundle install
Testowanie za pomocą Dockera
# szybki test na jednej maszynie
bundle exec kitchen test ssh-ubuntu1804-ansible-latest
# test na wszystkich maszynach
bundle exec kitchen test
# do celów deweloperskich
bundle exec kitchen create ssh-ubuntu1804-ansible-latest
bundle exec kitchen converge ssh-ubuntu1804-ansible-latest
bundle exec kitchen verify ssh-ubuntu1804-ansible-latest
# sprzątanie
bundle exec kitchen destroy ssh-ubuntu1804-ansible-latest
Testowanie za pomocą Virtualboxa
# szybki test na jednej maszynie
KITCHEN_YAML=".kitchen.vagrant.yml" bundle exec kitchen test ssh-ubuntu-1804
# test na wszystkich maszynach
KITCHEN_YAML=".kitchen.vagrant.yml" bundle exec kitchen test
# do celów deweloperskich
KITCHEN_YAML=".kitchen.vagrant.yml" bundle exec kitchen create ssh-ubuntu-1804
KITCHEN_YAML=".kitchen.vagrant.yml" bundle exec kitchen converge ssh-ubuntu-1804
Aby uzyskać więcej informacji, zobacz test-kitchen.
FAQ / Pułapki
Nie mogę zalogować się na swoje konto. Zarejestrowałem klucz klienta, ale nadal nie pozwala mi się zalogować.
Jeśli wyczerpałeś wszystkie typowe problemy (zapora, sieć, brak klucza, zły klucz, dezaktywowana konto itp.), może być tak, że Twoje konto jest zablokowane. Najszybszym sposobem, aby to sprawdzić, jest spojrzenie na hasz hasła dla użytkownika:
sudo grep myuser /etc/shadow
Jeśli hasz zawiera !
, Twoje konto jest zablokowane:
myuser:!:16280:7:60:7:::
Odpowiedni sposób rozwiązania tego to odblokowanie konta (passwd -u myuser
). Jeśli użytkownik nie ma hasła, można go odblokować za pomocą:
usermod -p "*" myuser
Alternatywnie, jeśli zamierzasz używać PAM, włączono je przez ssh_use_pam: true
. PAM pozwoli zablokowanym użytkownikom na wejście z kluczami.
Dlaczego moja aplikacja już nie łączy się przez SSH?
Zawsze najpierw sprawdź dzienniki, a jeśli to możliwe, spójrz na negocjację między klientem a serwerem, która kończy się podczas łączenia.
Zauważyliśmy pewne problemy w aplikacjach (opartych na pythonie i rubinie), które wynikają z użycia przestarzałego zestawu kryptograficznego. To koliduje z tym modułem wzmacniającym, który zmniejsza listę szyfrów, kodów uwierzytelniania wiadomości (MAC) i algorytmów wymiany kluczy (KEX) do bardziej bezpiecznego wyboru.
Po użyciu roli moduł szablonu/kopiowania/pliku Ansible nie działa już!
Ta rola domyślnie dezaktywuje SFTP. Ansible używa domyślnie SFTP do transferu plików do zdalnych hostów. Musisz ustawić scp_if_ssh = True
w swoim ansible.cfg. W ten sposób Ansible użyje SCP do kopiowania plików. Alternatywnie, możesz ponownie włączyć SFTP, ustawiając sftp_enabled
na prawda
.
Nie można zrestartować usługi sshd z powodu braku uprawnień
Jeśli uzyskasz poniższy błąd podczas uruchamiania handlera "restart sshd"
Nie można zrestartować usługi ssh: Nie udało się zrestartować ssh.service: Odrzucono dostęp
lub
błąd 1 podczas uruchamiania systemctl show dla 'ssh': Nie udało się połączyć z bus: Nie ma takiego pliku ani katalogu
przejdź przez playbook jako root
(bez become: yes
na poziomie playbooka) lub dodaj become: yes
do handlera.
To jest błąd z Ansible: zobacz tutaj i tutaj dla dalszych informacji.
Wkład
Zobacz wytyczne dla współczesnych.
Licencja i Autor
- Autor:: Sebastian Gumprich
- Autor:: Christoph Hartmann chris@lollyrock.com
Licencjonowane na podstawie Licencji Apache, Wersja 2.0 (tzw. "Licencja"); nie możesz używać tego pliku, z wyjątkiem, gdy jest to zgodne z Licencją. Możesz uzyskać kopię Licencji pod adresem
http://www.apache.org/licenses/LICENSE-2.0
O ile nie jest to wymagane na mocy obowiązujących przepisów lub uzgodnione na piśmie, oprogramowanie dystrybuowane na podstawie Licencji jest dystrybuowane na zasadzie "TAK JEST", BEZ GWARANCJI ANI WARUNKÓW JAKIEJKOLWIEK, ani wyraźnych ani dorozumianych. Zobacz Licencję w celu uzyskania konkretnych uprawnień i ograniczeń dotyczących Licencji.
This Ansible role provides numerous security-related ssh configurations, providing all-round base protection.
ansible-galaxy install dev-sec.ssh-hardening