SSH sunucumun etrafındaki güvenliğin kesinlikle sızdırmaz olduğundan emin olmak için ne gibi önlemler almalıyım?
Bu başlangıçtan itibaren topluluk wiki'si olacak, bu yüzden insanların sunucularını güvende tutmak için ne yaptığını görelim.
SSH sunucumun etrafındaki güvenliğin kesinlikle sızdırmaz olduğundan emin olmak için ne gibi önlemler almalıyım?
Bu başlangıçtan itibaren topluluk wiki'si olacak, bu yüzden insanların sunucularını güvende tutmak için ne yaptığını görelim.
Yanıtlar:
Kimlik doğrulama için şifreler yerine genel / özel anahtar çiftleri kullanın.
Sunucuya erişmesi gereken her bilgisayar için parola korumalı bir SSH anahtarı oluşturun:
ssh-keygen
İzin verilen bilgisayarlardan ortak anahtar SSH erişimine izin verin:
~/.ssh/id_rsa.pub
Her bilgisayardan içeriğini ~/.ssh/authorized_keys
sunucunun tek tek satırlarına kopyalayın veya ssh-copy-id [server IP address]
erişim verdiğiniz her bilgisayarda çalıştırın (istemde sunucu şifresini girmeniz gerekir).
Şifre SSH erişimini devre dışı bırak:
Aç /etc/ssh/sshd_config
, yazan satırı bul #PasswordAuthentication yes
ve değiştir PasswordAuthentication no
. Değişikliği uygulamak için SSH sunucusu arka planını yeniden başlatın ( sudo service ssh restart
).
Şimdi, SSH'yi sunucuya girmenin tek yolu hat içinde eşleşen bir anahtar kullanmaktır ~/.ssh/authorized_keys
. Bu yöntemi kullanarak, ben onlar benim şifresini tahmin bile, reddedilecektir çünkü kaba kuvvet saldırılarına umurumda değil. Kamuya açık / özel bir anahtar çiftinin kaba şekilde kullanılması bugünün teknolojisi ile mümkün değildir .
Öneririm:
Kaba kuvvet oturum açma girişimlerini önlemek için fail2ban kullanmak .
SSH üzerinden root olarak giriş yapmayı devre dışı bırakın. Bu, bir saldırganın hem kullanıcı adını hem de şifreyi bir saldırıyı daha zor hale getirdiğini bulması gerektiği anlamına gelir.
Ekle PermitRootLogin no
Blogunuza /etc/ssh/sshd_config
.
Sunucuya SSH yapabilen kullanıcıları sınırlama. Ya grup tarafından ya da sadece belirli kullanıcılar tarafından.
Ekle AllowGroups group1 group2
veya AllowUsers user1 user2
sunucuya SSH kişileri sınırlamak için.
sshd
makinenin kendinizi kilitleme önlemek için, sshd yeniden başlatmadan önce yapılandırma doğrudur. Ayrıntılar için bu blogu inceleyin - sshd -T
ana bilgisayarı yeniden başlatmadan önce yalnızca yapılandırma değişikliğinden sonra çalıştırın sshd
. Ayrıca, config değişikliğini yaparken makinede bir SSH oturumunun açık olmasını sağlayın ve config'i belirtilen şekilde doğrulayana ve belki de bir test SSH girişi yapmış olana kadar kapatmayın.
Diğer yanıtlar güvenlik sağlar, ancak günlüklerinizi daha sessiz hale getirecek ve hesabınızdan kilitlenmemenizin daha az muhtemel olmasını sağlayacak bir şey yapabilirsiniz.
Sunucuyu 22 numaralı bağlantı noktasından diğerine taşıyın. Ya ağ geçidinizde ya da sunucuda.
Güvenliği artırmaz, ancak tüm rasgele internet tarayıcılarının günlük dosyalarınızı karıştırmayacağı anlamına gelir.
HOTP veya TOTP ile iki faktörlü kimlik doğrulamayı etkinleştirin . Bu, 13: 10'dan itibaren kullanılabilir.
Bu, burada başka bir cevapta olduğu gibi, şifre kimlik doğrulaması üzerinden genel anahtar kimlik doğrulamasının kullanılmasını da içerir, ancak kullanıcının özel anahtarına ek olarak ikinci faktör cihazını tuttuğunu kanıtlamasını gerektirir.
Özet:
sudo apt-get install libpam-google-authenticator
Her kullanıcının , iki faktörlü aygıtlarını (ör. Google Authenticator Android uygulaması) google-authenticator
oluşturup ~/.google-authenticator
yapılandırmalarına yardımcı olan komutu çalıştırmasını isteyin.
Düzenle /etc/ssh/sshd_config
ve ayarla:
ChallengeResponseAuthentication yes
PasswordAuthentication no
AuthenticationMethods publickey,keyboard-interactive
sudo service ssh reload
Değişikliklerinizi almak için çalıştırın /etc/ssh/sshd_config
.
Düzenleyin /etc/pam.d/sshd
ve çizgiyi değiştirin:
@include common-auth
ile:
auth required pam_google_authenticator.so
Farklı yapılandırma seçenekleriyle ilgili daha fazla ayrıntı, geçen yılki blog gönderim: Ubuntu'da daha iyi iki faktörlü ssh kimlik doğrulaması .
Doğru oturum açma bilgisi sağlamayan sshd bloğu istemci IP'lerini yapın " DenyHØsts " bu işi oldukça etkin bir şekilde yapabilir. Bunu, bir şekilde dışardan erişilebilen tüm Linux kutularıma kurdum.
Bu, SSHD'ye yapılan zorla saldırıların etkili olmayacağından emin olacaktır, ancak hatırlayın (!) Bu şekilde, şifrenizi unutursanız kendinizi kilitlemeyi bırakabileceğinizi unutmayın. Bu, erişiminiz olmayan uzaktaki bir sunucuda bir sorun olabilir.
İşte yapılacak kolay bir şey: ufw'yi ("karmaşık olmayan güvenlik duvarı") yükleyin ve gelen bağlantıları sınırlamak için kullanın.
Komut isteminde şunu yazın:
$ sudo ufw limit OpenSSH
Eğer ufw kurulu değilse, bunu yapın ve tekrar deneyin:
$ sudo aptitude install ufw
Birçok saldırgan SSH sunucunuzu kaba kuvvetli şifreler için kullanmaya çalışacaktır. Bu, aynı IP adresinden sadece her 30 saniyede bir 6 bağlantıya izin verecektir.
Daha fazla güvenlik sağlamak veya bazı şirket ağlarının derinliklerinde SSH sunucularına erişmek istediğimde anonimleştirme yazılımı Tor kullanarak gizli bir servis kurarım .
localhost
./etc/tor/torrc
. Set HiddenServiceDir /var/lib/tor/ssh
ve HiddenServicePort 22 127.0.0.1:22
.var/lib/tor/ssh/hostname
. Gibi bir isim var d6frsudqtx123vxf.onion
. Bu gizli servisin adresi.Aç $HOME/.ssh/config
ve birkaç satır ekle:
Host myhost
HostName d6frsudqtx123vxf.onion
ProxyCommand socat STDIO SOCKS4A:127.0.0.1:%h:%p,socksport=9050
Ayrıca yerel ev sahibime de Tor lazım. Eğer ssh myhost
kurulursa girebilirim ve SSH Tor ile bir bağlantı açar. Diğer taraftaki SSH sunucusu portunu sadece localhost'ta açar. Böylece kimse "normal internet" üzerinden bağlanamaz.
Bu konuda bir Debian İdaresi makalesi var. Temel SSH sunucusu yapılandırmasını ve ayrıca güvenlik duvarı kurallarını kapsar. Bu, bir SSH sunucusunu sertleştirmek için de ilgi çekici olabilir.
Bkz. Makale: SSH erişimini güvende tutmak .
SSH sertleşmesine yaklaşımım ... karmaşık. Aşağıdaki öğeler, ağlarımın en uç sınırlarından sunucuların kendilerine kadar nasıl yaptığım konusundadır.
Blokaj listesindeki bilinen servis tarayıcıları ve imzalarıyla IDS / IPS üzerinden trafiğin sınır düzeyinde filtrelenmesi. Bunu Snort ile sınır güvenlik duvarım üzerinden gerçekleştiriyorum (bu benim yaklaşımım, bir pfSense aracı). Bazen, VPS'lerimde olduğu gibi bunu yapamam.
Güvenlik duvarı / SSH bağlantı noktalarının ağ filtrelemesi. Açıkça, yalnızca belirli sistemlerin SSH sunucularıma erişmesine izin veriyorum. Bu, ağımın sınırındaki bir pfSense güvenlik duvarı veya açıkça yapılandırılmış her sunucudaki güvenlik duvarları aracılığıyla yapılır. Buna rağmen, bunu yapamayacağım durumlar var (ki bu, güvenlik duvarlarının olayları test etmesine yardımcı olmayacağı özel kalem testi veya güvenlik testi laboratuarı ortamları hariç, neredeyse asla durum böyle değildir).
PfSense'imle veya bir iç güvenlik ağını DOĞRAYAN ve İnternet ve sistemlerden ayırma ile sınırlayıcı bir güvenlik duvarıyla birlikte, Sunuculara Yalnızca VPN Erişimi . Sunuculara ulaşmak için ağlarıma VPN girmeliyim, çünkü internete bakan bağlantı noktaları yok. Bu kesinlikle tüm VPS'lerim için işe yaramaz, ancak # 2 ile birlikte, VPN tarafından bu sunucuya 'ağ geçidi' olarak bir VPS'ye sahip olabilirim ve IP'lerinin diğer kutulara IP'lerine izin verebilirim. Bu şekilde, SSH'nin ne yapabileceğini ya da yapamayacağını tam olarak biliyorum - VPN olan tek kutum. (Veya, ev ağımda pfSense’in arkasındaki VPN bağlantım ve VPN erişimi olan tek kişi benim).
# 3 uygun olmayan durumlarda, fail2, 4 başarısız denemeden sonra engellemek ve IP'leri bir saat veya daha fazla süreyle engellemek üzere yapılandırılmış olarak yapılandırılır . Fail2ban'ı yapılandırmak acı verici olsa da ...
SSH portunu değiştirerek port gizleme. Bununla birlikte, bu, herhangi bir ek güvenlik önlemi olmadan da yapılması iyi bir fikir DEĞİLDİR - “Müstehcenlikle Güvenlik” mantığı birçok durumda çürütülmüş ve tartışmalıdır. Bunu IDS / IPS ve ağ filtreleme ile birlikte yaptım, ancak yine de kendi başına yapmak için ÇOK zayıf bir şey.
ZORUNLU İki Faktörlü Kimlik Doğrulama, Duo Security'nin İki Faktörlü Kimlik Doğrulama çözümleri ile . SSH sunucularımın her biri Duo'da yapılandırılmış durumda, öyle ki, içeri girmek için bile 2FA istemeleri gerçekleşiyor ve her erişimi onaylamam gerekiyor. (Bu nihai faydalı özelliktir - çünkü birisi benim parolamı girse veya girse bile Duo PAM eklentilerini geçemez). Bu, SSH sunucularımdaki yetkisiz erişime karşı en büyük korumalardan biridir - her kullanıcı girişi, Duo'da yapılandırılmış bir kullanıcıya bağlanmalıdır ve kısıtlayıcı bir sete sahip olduğum için sisteme yeni kullanıcılar giremez.
SSH’yi güvenceye almak için iki kuruş. Ya da en azından yaklaşım hakkındaki düşüncelerim.
FreeOTP uygulamasını Google Authenticator kullanmak yerine RedHat'tan teslim almak isteyebilirsiniz. Bazen uygulamayı güncellerken, sizi kilitler! ;-)
Bir Yubikey veya eToken PASS veya NG gibi başka donanım belirteçleri kullanmak istiyorsanız veya çok fazla kullanıcı veya çok sayıda sunucunuz varsa, açık kaynaklı iki faktörlü bir kimlik doğrulama arka ucu kullanmak isteyebilirsiniz.
Son zamanlarda bunun hakkında bir şeyler yazdım .
Son zamanlarda bunu yapmak için küçük bir öğretici yazdım. Temel olarak, PKI kullanıyor olmanız gerekir ve benim öğreticim ayrıca daha fazla güvenlik için Two-Factor Authentication'ın nasıl kullanılacağını gösterir. Bunlardan hiçbirini kullanmasanız bile, zayıf şifreleme takımlarını ve diğer temel bilgileri kaldırarak sunucuyu güvence altına almakla ilgili bazı bilgiler de var. https://joscor.com/blog/hardening-openssh-server-ubuntu-14-04/
Çok sayıda kullanıcı / sertifika için LDAP entegrasyonunu düşünün. Büyük kuruluşlar, sertifikaların kimlik doğrulaması için veya e-postaları imzalamak için kullanılıp kullanılmadıklarında, rozetlerde veya foblarda depolanan kullanıcı kimlik bilgileri ve sertifikaları için bir depo olarak LDAP'yi kullanır. Örnekler arasında openLDAP, openDJ, Active Directory, Oracle Universal Directory, IBM Directory Server, snareWorks ... bulunur.
Bilgisayarlar ve gruplar LDAP'ta yönetilebilir ve merkezi kimlik bilgisi yönetimi sağlanır. Bu şekilde, yardım masalarının büyük nüfuslarla başa çıkabilmek için tek bir yerden olması mümkündür.
İşte centOS entegrasyonuna bir link: http://itdavid.blogspot.com/2013/11/howto-configure-openssh-to-fetch-public.html
Ayrıca, coğrafi veritabanını kullanarak menşei ülkeye göre engelleyebilirsiniz.
Temel olarak ABD’de yaşıyorsanız, Rusya’daki bir kişinin SSH’nize bağlanması için hiçbir sebep yoktur, bu nedenle otomatik olarak engellenir.
Komut dosyasını burada bulabilirsiniz: https://www.axllent.org/docs/view/ssh-geoip/
Ayrıca bu IP'lere giden tüm trafiği otomatik olarak bırakmak için iptables komutlarını (damlacıklarım için yaptım) ekleyebilirsiniz.