
यह Ansible role कई सुरक्षा-संबंधित ssh कॉन्फ़िगरेशन प्रदान करता है, जो सर्वांगीण बुनियादी सुरक्षा सुनिश्चित करता है।
ध्यान दें: इस role को हमारे hardening-collection में स्थानांतरित कर दिया गया है:
कृपया वहाँ पर सभी issues और pull requests खोलें!
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। wildcard पते पर बाइंडिंग को बाध्य करने के लिए 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" सेटिंग्स के अतिरिक्त पर्यावरण चर नामों की एक whitelist निर्दिष्ट करना संभव है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 के लिए) का उपयोग कर सकते हैं। ये विकल्प फ़ाइल की शुरुआत में सेट किए जाएंगे ताकि आप फ़ाइल में आगे विकल्पों को ओवरराइड कर सकें।
उदाहरण playbook:
- hosts: localhost
roles:
- dev-sec.ssh-hardening
vars:
ssh_custom_options:
- "Include /etc/ssh/ssh_config.d/*"
sshd_custom_options:
- "AcceptEnv LANG"
यह role सर्वर से कनेक्ट करने के लिए डिफ़ॉल्ट पोर्ट 22 या inventory में कॉन्फ़िगर किए गए पोर्ट का उपयोग करता है। यदि डिफ़ॉल्ट ssh पोर्ट को ssh_server_ports के माध्यम से बदला जाता है, तो ssh सर्वर के पुनरारंभ होने के बाद भी, यह पिछले पोर्ट का उपयोग करके कनेक्ट करने का प्रयास करेगा। उसी सर्वर पर इस role को फिर से चलाने के लिए, नए ssh पोर्ट का उपयोग करने के लिए inventory को अपडेट करना होगा।
यदि idempotency महत्वपूर्ण है, तो कृपया role ssh-hardening-fallback का उपयोग करने पर विचार करें, जो इस role के चारों ओर एक wrapper है जो कॉन्फ़िगर किए गए पोर्ट तक पहुँचने में असमर्थ होने पर पोर्ट 22 पर वापस आ जाता है।
- hosts: localhost
roles:
- dev-sec.ssh-hardening
Role का स्थानीय रूप से परीक्षण करने का पसंदीदा तरीका 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 के माध्यम से कनेक्ट क्यों नहीं होता?
हमेशा पहले लॉग फ़ाइलों को देखें और यदि संभव हो तो कनेक्ट करते समय क्लाइंट और सर्वर के बीच पूर्ण negotiation देखें।
हमने कुछ एप्लिकेशनों (python और ruby पर आधारित) में समस्याएँ देखी हैं जो पुराने crypto सेट के उपयोग के कारण होती हैं। यह इस hardening मॉड्यूल से टकराता है, जिसने ciphers, message authentication codes (MACs) और key exchange (KEX) एल्गोरिदम की सूची को अधिक सुरक्षित चयन तक कम कर दिया है।
Role का उपयोग करने के बाद Ansibles template/copy/file मॉड्यूल अब काम नहीं करता!
यह role डिफ़ॉल्ट रूप से SFTP को निष्क्रिय कर देता है। Ansible डिफ़ॉल्ट रूप से फ़ाइलों को रिमोट होस्ट पर स्थानांतरित करने के लिए SFTP का उपयोग करता है। आपको अपने ansible.cfg में scp_if_ssh = True सेट करना होगा। इस तरह Ansible फ़ाइलों को कॉपी करने के लिए SCP का उपयोग करता है। वैकल्पिक रूप से आप sftp_enabled को true पर सेट करके SFTP को फिर से सक्षम कर सकते हैं।
विशेषाधिकारों की कमी के कारण sshd-service को पुनरारंभ नहीं कर सकते
यदि आपको handler "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
या तो playbook को root के रूप में चलाएँ (playbook स्तर पर become: yes के बिना), या handler में become: yes जोड़ें।
यह Ansible के साथ एक बग है: अधिक जानकार