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 lub yes, 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 na prawda, aby wymusić powiązanie na adresie dzikiej karty. Ustaw na clientspecified, aby pozwolić klientowi określić, do którego adresu ma się powiązać.
  • 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, gdy ssh_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.
  • 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.
  • ssh_client_port
    • Domyślnie: '22'
    • Opis: Określa numer portu do połączenia na zdalnym hoście.
  • ssh_client_compression
    • Domyślnie: fałsz
    • Opis: Określa, czy klient żąda kompresji.
  • ssh_compression
    • Domyślnie: fałsz
    • Opis: Określa, czy kompresja po stronie serwera jest włączona po pomyślnym uwierzytelnieniu użytkownika.
  • ssh_login_grace_time
    • Domyślnie: 30s
    • Opis: określa czas dozwolony na pomyślne uwierzytelnienie do serwera SSH.
  • ssh_max_auth_retries
    • Domyślnie: 2
    • Opis: Określa maksymalną liczbę prób uwierzytelnienia dozwoloną na pojedyncze połączenie.
  • ssh_max_sessions
    • Domyślnie: 10
    • Opis: Określa maksymalną liczbę otwartych sesji dozwoloną z danego połączenia.
  • ssh_print_debian_banner
    • Domyślnie: fałsz
    • Opis: prawda, aby wyświetlić baner specyficzny dla Debiana.
  • ssh_server_enabled
    • Domyślnie: prawda
    • Opis: fałsz, aby wyłączyć serwer opensshd.
  • ssh_server_hardening
    • Domyślnie: prawda
    • Opis: fałsz, aby zatrzymać wzmocnienie serwera.
  • 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".
  • 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.
  • 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.

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

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.

O projekcie

This Ansible role provides numerous security-related ssh configurations, providing all-round base protection.

Zainstaluj
ansible-galaxy install dev-sec.ssh-hardening
Licencja
Unknown
Pobrania
3.3M
Właściciel
Security + DevOps: Automatic Server Hardening