Güçlü güvenlik en iyi uygulamaları


37

Ansible'ı veri merkezime tanıtacağım ve kontrol makinesini nerede bulacağınız ve SSH anahtarlarını nasıl yöneteceğiniz konusunda en iyi güvenlik uygulamalarını arıyorum.

Soru 1: kontrol makinesi

Elbette bir kontrol makinesine ihtiyacımız var. Kontrol makinesinde kayıtlı ortak SSH anahtarları var. Bir saldırgan kontrol cihazına erişebiliyorsa, potansiyel olarak tüm veri merkezine (veya Ansible tarafından yönetilen sunuculara) erişebilir. Yani veri merkezinde özel bir kontrol makinesine veya bir uzaktan kumanda makinesine sahip olmak daha mı iyi (dizüstü bilgisayarımın veri merkezine uzaktan bağlanması gibi)?

En iyi uygulama dizüstü bilgisayarımı kullanmaksa (tabii ki çalınabilir, ancak genel anahtarlarım bulutta çevrimiçi olarak güvenli bir şekilde çevrimiçi olarak veya taşınabilir şifreli bir cihazda çevrimdışı olarak saklanabilir), ya da bazı web arabirimleri kullanmam gerekirse Veri merkezi içine merkezileştirilmiş bir makineye kurulması gereken Ansible Tower, Semafor, Rundeck veya Foreman gibi Ansible? Nasıl güvence altına alınır ve "tek bir saldırı noktası" haline gelmesini önler

Soru 2: SSH anahtarları

Root tarafından yürütülmesi gereken bazı görevleri yapmak için Ansible kullanmam gerektiğini varsayalım (yazılım paketleri veya bunun gibi bir şey yüklemek gibi). Bence en iyi uygulama kök kullanıcıyı kontrol edilen sunucularda kullanmak değil, sudo izinlerine sahip Ansible için normal bir kullanıcı eklemek. Ancak, Ansible'ın hemen hemen her görevi yapması gerekiyorsa, sudo ile her komuta erişimi olması gerekir. Peki, en iyi seçenek nedir:

  • Ansible'ın kök kullanıcıyı kullanmasına izin ver ~/.ssh/authorized_keys
  • sudo erişimi olan Ansible'a tahsis edilmiş ayrıcalıklı bir kullanıcı oluştur
  • Ansible kullanıcısının her komutu sudo aracılığıyla bir şifre belirleyerek çalıştırmasına izin verin (bu sunucuları kontrol etmek için Ansible kullanan her sysadmin tarafından bilinmesi gereken benzersizdir)
  • Ansible kullanıcısının herhangi bir şifre belirlemeden sudo aracılığıyla her komutu çalıştırmasına izin ver
  • başka ipucu var mı?

Özel bir yönetim alt ağı (veya VLAN) istiyorsunuz. yönetilebilir kontrol bilgisayarınız bu alt ağda. Kontrol bilgisayarı ile iletişim kurmanız gerekirse, VPN'yi bu alt ağa girersiniz. Ansible'ın kök olmasına izin verme
Neil McGuigan

1
Ansible kontrol hostu dahili LAN'da olacak ve dışarıdan erişilebilir olmayacak, fakat bunun yeterli olmadığını düşünüyorum.
Mat

Yanıtlar:


15

Bastion ana bilgisayarı (kontrol edilebilir kontrol merkezi) ayrı bir alt ağa aittir. Dışarıdan doğrudan erişilebilir olmamalıdır, doğrudan erişilebilir olmamalıdır dan yönetilen sunucular!

Dizüstü bilgisayarınız en az güvenli cihazdır. Bir aptal posta, bir aptal flaş güvenlik açığı, bir aptal misafir Wifi ve piyonlanır.

Sunucular için ssh ile root erişimine hiç izin vermeyin. Birçok denetim bu konuda heyecan verici.

Sorumlu olmak için, her yöneticinin her hedef sunucuda kendi kişisel hesabını kullanmasına izin verin ve şifrelerle sudo yapmasına izin verin. Bu şekilde iki kişi arasında şifre paylaşılmaz. Her sunucuda kimin ne yaptığını kontrol edebilirsiniz. Kişisel hesaplar parola ile oturum açmaya izin veriyorsa, yalnızca ssh şifresine izin veriyorsa veya her ikisini birden gerektiriyorsa size kalmış.

Ansible'ı netleştirmek için tek bir hedef giriş adı kullanmak gerekmez . Her yönetici kişisel hedef giriş adına sahip olabilir ve olmalıdır.

Yan not: Parolası varsa, asla bir kelime ("ansible" veya "admin" veya "cluster" veya "management" veya "operator" gibi) bir hesap oluşturmaya çalışmayın. Şifresi olan hesabın tek iyi adı "jkowalski" gibi bir insanın adıdır. Hesap yoluyla yapılan ve şifresini uygunsuz şekilde korumaktan sorumlu olan yalnızca bir insan sorumlu olabilir, "yanıtlanabilir" olamaz.


Teşekkürler, beni veri merkezinde ayrı bir alt ağda bulunan merkezi bir ana bilgisayar kullanmaya ikna ettiniz. Ayrıca her sysadmin başına bir kişisel kullanıcı kullanmanın en iyisi olduğunun farkındayım, ancak şimdi başka bir sorum var (belki de bu ayrı bir Serverfault sorusunda daha iyi olabilir): NIS, NFS kullanmadan Linux ana bilgisayarlarında kullanıcıları ve SSH anahtarlarını nasıl merkezileştireceğimi paylaşımlar veya bunun gibi bir şey? Lütfen zaten Windows sunucuları için Active Directory'ye sahip olduğumu unutmayın.
Mat

Tamam, sorumu daha iyi düşünerek iki olası cevabım var: LDAP anahtar deposu veya Userify kullanın (aşağıdaki iki cevaba bakınız). Ama ... Gerçekten ihtiyacım var mı? Hayır, yeni kullanıcıları ve anahtarları Ansible'ın kendisi aracılığıyla dağıtmak için kendi kullanıcımı kullanırsam! :-)
Mat

@Mat, tamamen kabul edildi - aşağıda belirttiğim gibi, ekibiniz büyüyene kadar Userify veya benzeri bir araca ihtiyacınız yok. (Yine de çok daha güzel hale getirir.) LDAP yüklemek biraz acı verici (pam_ldap ve nss_ldap araştırması) ama saniyeler içinde Ansible, Chef, Puppet, vb. İle entegre olacak araçlar geliştirdik. <20 sunucu.
Jamieson Becker

16

> Soru 1: kontrol makinesi

Userify'de (tam açıklama: aslında ssh anahtarlarını yönetmek için yazılım sunuyoruz), aynı zamanda en büyük SSH anahtar deposunu da işlettiğimiz için bu konuyu sürekli olarak ele alıyoruz. Genel olarak, bulut kullanmak yerine yerel kurulum yapılmasını öneriyoruz, çünkü kontrolün artması, yüzey alanınızın azaltılması, gerçekten bilinen güvenilir ağlara kilitlenebiliyor.

Hatırlanması gereken en önemli şey, bunun gibi doğru bir şekilde inşa edilmiş bir sistemde, bir saldırganın sızdırabileceği herhangi bir önemli sır olmamasının gerektiğidir . Birisi veri merkezinize bir forklift yüklerse ve sunucunuzla birlikte uzaklaşırsa, bazı ağır şifreli şifreler, muhtemelen ağır şifreli dosyalar ve bazı özel anahtarlar olmadan bazı genel anahtarlar dışında pek bir şey elde etmezler. Başka bir deyişle, o kadar değil.

Sizin de belirttiğiniz gibi, buradaki gerçek tehdit vektörleri, bir saldırgan bu makinenin kontrolünü ele geçirir ve kendi kullanıcı hesaplarını ve (genel) anahtarlarını dağıtmak için kullanırsa ne olur . Bu hemen hemen her bulut platformu için bir risktir (örneğin: Linode). Saldırı yüzeyini en aza indirgemek (yalnızca birkaç bağlantı noktasını açığa çıkarmak ve bu bağlantı noktalarını mümkün olduğunca kilitlemek) ve tercihen ayrıcalık yükselmesine ve çeşitli saldırılara karşı sertleştirilmiş yazılımı kullanmak anlamına gelen kontrol düzlemine erişimi önlemeye odaklanmalısınız. SQL enjeksiyon, XSS, CSRF, vb.) Kontrol düzlemine 2FA / MFA erişimini etkinleştirin ve bu kontrol düzlemini mümkün olduğu kadar kilitlemeye odaklanın.

Yani veri merkezinde özel bir kontrol makinesine veya bir uzaktan kumanda makinesine sahip olmak daha mı iyi (dizüstü bilgisayarımın veri merkezine uzaktan bağlanması gibi)?

Bu var kesinlikle daha iyi onu izole edip / önlemek hırsızlık veya yetkisiz erişim riskini en aza indirmek için aşağı kilitlemek, çünkü güvenli bir veri merkezlerinde özel bir kontrol otomatı var.

En iyi uygulama benim laptop kullanmaktır (tabii ki, çalıntı olabilir, ama benim ortak anahtarlar güvenli bir taşınabilir kriptolanmis cihazda bulut veya çevrimdışı çevrimiçi olarak kaydedilir olabilir), Eğer bazı arayüzlerini kullanmayı gerekiyorsa neyi ile Veri merkezi içine merkezileştirilmiş bir makineye kurulması gereken Ansible Tower, Semafor, Rundeck veya Foreman gibi Ansible?

Anahtarlarınızı (hatta Userify'yi) yönetmek için HERHANGİ bir web arayüzünü veya ikincil kontrol düzlemini çalıştırmanıza gerek kalmaz, daha fazla sayıda kullanıcı ve sunucular arasında farklı yetkilendirme düzeyleri nedeniyle yönetim sorunlarına girmeye yetecek kadar büyük oluncaya kadar Anahtarları güncellemek için Ansible'a bilgisi veya erişimi olmayan kullanıcılarınız için elden tutma. İlk başta doğrulamak, bir sürü kabuk betiğinden (bugün muhtemelen Ansible olurlardı!) Çok fazla değildi ve sizler için ek yönetim kontrolüne ve kolay bir şekilde yönetmeleri / döndürmeleri için kolay yollara ihtiyacınız olana kadar bu konuda hiçbir yanlışlık yok. kendi anahtarlarım. (Tabii ki, eğer o noktaya gelirseniz Userify'ye bir göz atın!)

Nasıl güvence altına alınır ve "tek bir saldırı noktası" haline gelmesini önler?

Elbette, işleri kilitlemek için internetteki bütün kaynakları kontrol edin, ancak en önemlisi güvenli bir temelle başlayın:

1. Çözümünüzü en başından itibaren güvenlikle düşünün. Geleneksel olarak daha az problemi olan teknolojiyi (örneğin, veritabanı veya diller) seçin ve ardından aklı başında güvenlikle kodlayın. Gelen tüm verileri, güvenilir kullanıcılardan bile temizleyin. Paranoya bir erdemdir.

2. Sonunda, her şey bozulur. Bu meydana geldiğinde hasarı en aza indirin: daha önce belirttiğiniz gibi, gizli malzemelerin kullanımını en aza indirmeye çalışın.

3. Basit tutun. En son egzotik şeyleri yapmayın, güvenliğinizi ölçülebilir ve kanıtlanabilir bir şekilde artıracağından emin değilseniz. Örneğin, şifreleme katmanımız için AES üzerinden X25519 / NaCl (libsodium) seçtik (her şeyi, dinlenmekte olan ve hareket halindeki her şeyi şifreliyoruz) çünkü orijinal olarak güvendiğimiz biri tarafından tasarlandı ve yazıldı (DJB ve ark.) Schneier ve Google'ın güvenlik ekibi gibi ünlü araştırmacılar. Basitlik eğiliminde olanları, eğer daha yeniyse kullanın, çünkü basitlik, derin böcekleri gizlemeyi zorlaştırır.

4. Güvenlik standartlarını karşılayın. PCI ya da HIPAA Güvenlik Kuralı gibi bir güvenlik rejimine girmeseniz bile, bu standartları okuyup bunları nasıl karşılayacağınızı ya da en azından çok güçlü telafi edici kontrolleri anlayın. Bu, 'en iyi uygulamaları' gerçekten karşıladığınızdan emin olmanıza yardımcı olacaktır.

5. Dış / bağımsız penetrasyon testini yapın ve sürekli olarak bu en iyi uygulamaları takip ettiğinizden emin olmak için hata ödülleri çalıştırın . Zeki ve motive olmuş bazı insanlar onunla dalga geçene kadar her şey harika gözüküyor ... bittiğinde çözümünüze büyük bir güven duyacaksınız.


Soru 2: SSH anahtarları En iyi seçenek hangisidir: Ansible'ın kök kullanıcısını kullanmasına izin verin (genel anahtarı kaydedildi ~/.ssh/authorized_keys/ Ansible kullanıcısının her komutu sudo yoluyla sudo yoluyla çalıştırmasına izin verin (her sysadmin tarafından bilinmesi gereken özel bir şey). bu sunucuları kontrol etmek için Ansible kullanıyor)

Sunucularda, hatta sudo için bile şifreleri kullanmaktan kaçının. Bu sırlarla uğraşır ve nihayetinde güvenliğinizi zayıflatır (makineler arasında sudo şifresini çok kolay değiştiremezsiniz, bir yere saklamanız gerekir, şifre gerçekten sunucudan sunucuya otomatik olarak yapamayacağınız anlamına gelir) tamamen SSH'yi varsayılan ayarlarında bırakırsanız, bu parolalar kaba bir şekilde zorlanabilir, bu da anahtarları biraz anlamsız kılar. Ayrıca, root kullanıcısını herhangi bir amaç için kullanmaktan ve özellikle de uzaktan giriş yapmaktan kaçının.

Sudo erişimi olan Ansible'a adanmış ayrıcalıklı bir kullanıcı oluşturun / Ansible kullanıcısının herhangi bir şifre belirlemeden sudo aracılığıyla her komutu çalıştırmasına izin verin

Kesinlikle. Sudo rolleriyle geri dönüşlü olarak denetleyebileceğiniz ayrıcalıklı bir kullanıcı. İdeal olarak, sunucu erişiminden sudo erişimi olan (şifre olmadan) sunucuya / sunucuya adanmış iletişimlere adanmış standart bir kullanıcı oluşturun.

... NB, eğer Userify kullanıyor olsaydın, yapmayı önerdiğim gibi, bir kullanıcı için bir Userify kullanıcısı oluşturmak olurdu (birden fazla kontrol edilebilir makineye sahipseniz bunu projeye veya hatta sunucu grubuna bölebilirsiniz), kontrol sunucusundaki bir SSH anahtarını kullanın ve genel anahtarını Userify profil sayfasında sağlayın. (Bu metin kutusu aslında olur /home/ansible/.ssh/authorized_keys). Bağlanabilir sistem hesabını, uzak yedekleme hesabı, gizli yönetim vb. Diğer sunucudan sunucuya sistem hesaplarından ayrı tutmalısınız. Ardından, insanları davet edin; kendi anahtarlarını da oluşturabilir ve yönetebilirler ve her şey ayrı kalır. Ancak, bir Ansible kontrol sunucusunu kilitlemek gibi, Userify sunucunuzu (ya da ne tür bir çözüm dağıtırsanız) aynı şekilde kilitlemeyi deneyin.

başka ipucu var mı?

Bence kesinlikle bunun doğru yolunda ve doğru soruları soruyorsun. Bu tür bir şeyi tartışmak istiyorsanız, bana e-posta gönderin (kullanıcı adınızdaki ilk ad soyad) ve sonuçta hangi yöne gideceğinize bakmaksızın sohbet etmekten mutluluk duyarım. İyi şanslar!


5

Cevap 1: kontrol makinesi

Her ikisinden de biraz, dizüstü bilgisayarınızı VIA bir ana bilgisayar sunucusuna bağlanmak için kullanabilirsiniz. gibi bir şey:

Host private1
  IdentityFile ~/.ssh/rsa_private_key
  ProxyCommand ssh user@bastion -W %h:%p

Host bastion
  IdentityFile ~/.ssh/bastion_rsa_key

Daha fazlası

Bastion sunucusu için bir anahtarın ve arkasındaki ana bilgisayar için ayrı bir anahtarın olduğu yer. (şahsen gpg-agent / ssh-agent kullanırdım)

Cevap 2: Doğrulama

Belirli "en iyi" belirli uygulamaların, en iyi diğer ssh bağlantısı en iyi uygulamalarından ne kadar farklı olduğundan emin değilim.

Aşağıdaki kimlik doğrulamaların bir kombinasyonu:

Diğer düşünceler:

  • Her zaman gizli / özel bilgileri gizli kasada saklayın.
  • Yaptığınız şey sudo / root gerektirmedikçe, Ansible'ın çalışması için SUDO / Root gerekmez.
  • Ansible izinleri birçok farklı şekilde yükseltebilir

Son olarak, pencereler hakkında hiçbir şeyden bahsetmedin. Bu yüzden sadece bunu kullanmadığınızı varsayabilirim. Ancak bu durumda dizüstü bilgisayarınızın bastion host (delegate_to bastion.hostname.fqdn:) ve kerberos / winrm https ile kerberos biletleri kullanmasını sağlamak için delege seçeneğini kullanırdım .

Kaçırmanız durumunda, hesaplama için en iyi yöntem, asla root olarak bir şey yapmayın, daima adlandırılmış hesapları kullanın

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.