Soru Ana bilgisayar parolalarıyla güvenilir bir şekilde nasıl güvenli bir şekilde uygulanabilir?


Kullanmak istiyorum yanıtlayıcı ' varolan sunucu grubunu yönetmek. Bir tane yarattım ansible_hosts dosya ve başarıyla test edildi -K seçenek) sadece tek bir ana bilgisayarı hedefleyen komutlarla

ansible -i ansible_hosts host1 --sudo -K # + commands ...

Sorunum şu ki, her ana bilgisayardaki kullanıcı parolalarının farklı olması, ancak bunu Ansible'da kullanmanın bir yolunu bulamıyorum.

kullanma -K, Ben sadece bir sudo parola-ön-için sorulur, daha sonra tüm sonraki ana bilgisayarlar için sorulmadan deneniyor gibi görünüyor:

host1 | ...
host2 | FAILED => Incorrect sudo password
host3 | FAILED => Incorrect sudo password
host4 | FAILED => Incorrect sudo password
host5 | FAILED => Incorrect sudo password

Şimdiye kadar araştırmalar:

  • bir StackOverflow sorusu bir yanlış cevapla ("kullan -K") ve şifre çözücü sudo gerekli keşfettim" diyerek yazarın bir cevap

  • Ansible dokümanlar"Parolasız sudo'nun kullanımı, işleri otomatikleştirmeyi kolaylaştırır, ancak gerekli değil"(vurgu benim)

  • Bu güvenlik StackExchange sorusu bunu okumak gibi alır NOPASSWD gerekli

  • makale "Ölçeklenebilir ve Anlaşılabilir Hazırlama ..." diyor ki:

    "çalışan sudo, Ansible sonsuza dek engellemek için emin bir yol olan bir parola yazmayı gerektirebilir. Basit bir düzeltme, hedef ana bilgisayarda visudo çalıştırmak ve Ansible kullanacağı kullanıcı için bir parola yazmanızın gerekmediğinden emin olmaktır"

  • makale "Temel Ansik Oyun Kitapları", diyor ki

    "Ansible root olarak hedef sunucuya giriş yapabilir ve sudo ihtiyacını ortadan kaldırabilir, ya da ansible kullanıcısı parola olmadan sudo'nun olmasına izin verebilir, ama yapma düşüncesi benim dalağımın benim gulletimi fırlatmak ve nefes borcumu engellemekle tehdit etmesini sağlar. yapamaz"

    Düşüncelerim tam olarak, ama sonra tek bir sunucunun ötesine nasıl uzanacak?

  • ansible konu # 1227, "Ansible bir oyun kitabındaki tüm kullanıcılar için sudo parolası sormalı", bir yıl önce mpdehaan tarafından yorumda bulunmuştu. "Bunun için fazla talep görmedim, çoğu insan sadece bir kullanıcı hesabından veya çoğu zaman anahtarlar.

Öyleyse insanlar böyle durumlarda Ansible'ı nasıl kullanıyor? Ayar NOPASSWD içinde /etc/sudoersşifreleri ana bilgisayarlarda yeniden kullanmak veya kök SSH girişini etkinleştirmek, güvenlik konusunda oldukça ciddi düşüşler gibi görünüyor.


99
2017-12-09 11:49


Menşei


SSH anahtarlarını kullanmamanın bir nedeni var mı? - Trondh
SSH anahtarlarını zaten kullanıyorum; onlar etkilemez sudo (Bu hala bir şifre gerektirir). - supervacuo
Bu tam olarak aradığınız şey olmayabilir, ancak Ubuntu kutularında hala anahtarları kullanıyorum, yani doğrudan kök olarak almak için genel anahtarımı / root / authorized_keys dizinine koyuyorum. Açık dezavantaj, ssh üzerinden root girişlerine izin veriyor ... Ayrıca ssh üzerinden şifre girişlerini reddediyorum ve ek güvenlik için fail2ban'ı çalıştırıyorum. - senorsmile
@senorsmile cevabı için teşekkürler! Bunun yerine bir cevaba dönüştürür müsünüz, bu yüzden soruyu okumadığınız için sizi reddedebilirim? - supervacuo
diğer bir deyişle  ansible_ssh_password ayar sadece SSH şifresi için geçerlidir (ipucu isminde ...). & Zaten anahtar tabanlı SSH girişini kullanıyorum. - supervacuo


Cevaplar:


Kesinlikle araştırmanı yaptın ...

Başarmak istediğiniz şeylerle ilgili tüm deneyimlerimden, desteklenmiyor. Bahsettiğiniz gibi, ansible parolasız sudo gerektirmediğini belirtir ve siz doğru değilsiniz. Ancak, birden çok yapılandırmayı çalıştırmadan, birden çok sudo şifresini anlık olarak kullanabileceğimi henüz görmedim.

Yani, tam olarak aradığınız çözümü sunamıyorum, ama sen sordun ...

"Yani ... insanlar böyle durumlarda Ansible'ı nasıl kullanıyorlar?   / Etc / sudoers içinde NOPASSWD, ana bilgisayarlarda şifreyi yeniden kullanma veya etkinleştirme   Kök SSH girişi, güvenlik konusunda oldukça ciddi düşüşler görüyor. "

Sana bunun hakkında bir görüş verebilirim. Benim kullanım durumum, işimizin doğası gereği bazı delice sıkı güvenlik kontrolleri tasarlamak / uygulamak zorunda olduğum global bir SaaS firmasını destekleyen çoklu veri merkezlerinde 1k düğümdür. Güvenlik her zaman eylemi dengeliyor, daha fazla kullanılabilirlik daha az güvenlik, 10 sunucu veya 1.000 veya 100.000 çalıştırıyorsanız bu işlem farklı değil.

Parola veya ssh tuşları ile kök girişlerini kullanmamanız kesinlikle doğrudur. Aslında, sunucularda bir ağ kablosu takılı olduğunda kök girişi tamamen devre dışı bırakılmalıdır.

Parola yeniden kullanımı hakkında konuşalım, büyük bir kuruluşta, sysadmins'den her bir düğümde farklı parolalar olmasını istemek mantıklı mıdır? belki birkaç düğüm için, ancak 1000 düğümde farklı şifreler olması durumunda yöneticilerim / mühendislerim isyan ederdi. Bunu neredeyse imkansız kılacak şekilde uygulamak, her kullanıcının bir yerde kendi şifrelerini saklamak zorunda kalacağını umarız. Ve düz metinde çıkarılabildiği bir yere bir şifre koyduğunuzda, güvenliğinizi büyük ölçüde azalttınız. Onları bir makinede sudo'ya giriş yapmak veya çağırmak için ihtiyaç duydukları her defasında bir keypass dosyasına başvurmak zorunda kaldıklarından, kalp, bir veya iki gerçekten güçlü şifreyi bilmelerini isterim.

Dolayısıyla, şifre yeniden kullanımı ve standartlaştırma, güvenli bir ortamda bile tamamen kabul edilebilir ve standart olan bir şeydir. Aksi takdirde ldap, keystone ve diğer dizin hizmetlerinin bulunması gerekmez.

Otomatik kullanıcılara geçtiğimizde, ssh tuşları sizi içeri almak için harika çalışıyor, ancak yine de sudo'dan geçmeniz gerekiyor. Seçimleriniz otomatik kullanıcı için standart bir paroladır (birçok durumda kabul edilebilir) veya işaret ettiğiniz gibi NOPASSWD'yi etkinleştirin. Çoğu otomatik kullanıcı sadece birkaç komut yürütür, bu nedenle NOPASSWD'yi etkinleştirmek, ancak sadece önceden onaylanmış komutlar için oldukça mümkündür ve kesinlikle istenir. Yapılandırma yönetiminizi (bu durumda söylenebilir) kullanarak sudoers dosyanızı yönetmek için parolasız komutlar listesini kolayca güncelleyebilmenizi öneririm.

Şimdi, riski daha fazla yalıtmak için ölçeklemeye başladığınızda yapabileceğiniz bazı adımlar var. 1000 ya da öylesine düğümlerimiz olsa da, hepsinin 'üretim' sunucuları değil, bazıları test ortamları, vs.'dir. Tüm yöneticiler, üretim sunucularına erişemezler, ancak aynı SSO kullanıcı / geçişi | tuşlarını kullanabildikleri gibi . Ancak, otomatik kullanıcılar biraz daha güvenlidir, örneğin, üretim dışı yöneticilerin erişebileceği otomatik bir araç, üretimde kullanılamayan bir kullanıcı ve kimlik bilgilerine sahiptir. Tüm düğümlerde ansible başlatmak istiyorsanız, bunu bir kez üretim dışı ve üretim için bir kez olmak üzere iki grup halinde yapmanız gerekir.

Ayrıca kukla kullanıyoruz, çünkü zorlayıcı bir yapılandırma yönetim aracı olduğu için, tüm ortamlarda çoğu değişiklik onun içinden geçer.

Açıkçası, alıntı yaptığınız bu özellik isteği yeniden açılırsa / tamamlandığında, yapmak istediğiniz şey tamamen desteklenir. Yine de olsa, güvenlik bir risk değerlendirme ve uzlaşma sürecidir. Bir not defterine başvurmadan şifreleri hatırlayabileceğiniz birkaç düğümünüz varsa, ayrı şifreler biraz daha güvenli olacaktır. Ama çoğumuz için, bu uygun bir seçenek değil.


52
2017-12-30 16:53



Teşekkürler, @Zeb - Düzinelerce binlerce sunucunun kullanabileceğini hayal etmiştim. NOPASSWD Zaten akıl sağlığı nedenleriyle (muhtemelen daha sıkı güvenlik duvarı kuralları tarafından destekleniyor) vb.), ancak tehdit modelinde kullanım durumunuzu ve düşüncelerinizi okumak iyidir. - supervacuo
Yine de, "ön onaylı" ile sınırlandırmayla ilgili önerinizden bir yorum. sudo komutları (bunu keşfettiğimde gerçekleşmişti) NOPASSWD oldukça fazla gereklidir). Ne yazık ki, bu görünüyor tamamen desteklenmeyen de - ansible arama konusunda hiçbir söz vermez Örneğin.  chown veya mkdir doğrudan ikili ve mümkün olması gerekir sudo /bin/sh çoğu modülün çalışması için. - supervacuo
Mühendislerimden birinin bir süre önce şikayet ettiğini hatırlıyorum, bu sinir bozucu. - Zeb


Ansible 1.5'den itibaren, bir şifreli kasa host_vars ve diğer değişkenler için. Bu, en azından bir ana bilgisayar (veya grup başına) depolamanızı sağlar. ansible_sudo_passdeğişken güvenli. Ne yazık ki, --ask-vault-pass Yalnızca, her bir olası çağrı için tek bir kasa şifresi ister, bu nedenle birlikte kullanacağınız tüm ana makineler için tek bir kasa şifresiyle sınırlandırılırsınız.

Yine de, bazı kullanımlar için bu, şifrelenmiş host_var'lara erişimi olmayan bir saldırganın, saldırıya uğradığı her makine (veya makine grubu) için ayrı bir sudo şifresine ihtiyaç duyması nedeniyle, birden fazla ana bilgisayarda tek bir sudo şifresine sahip olmak üzerine bir gelişme olabilir.


36
2018-05-10 20:32



ansible_sudo_pass Seçenek de yeni görünüyor ve istediğimi yapıyor gibi görünüyor. Tek bir kasa şifremi de benim amaçlarım için idealdir. Teşekkürler! - supervacuo
Şifrelenmekten kaçınmanın bir yolu var mı herşey  host_vars bu yöntemi kullanarak? (Alex Dupuy tarafından belirtilen potansiyel bir sınırlama) - supervacuo
@supervacuo - Tüm ana bilgisayar varyasyonlarını şifrelemekten kaçınmak için, main.yml (şifrelenmemiş) ve secret.yml (şifreli) içeren bir host var dizini kullanın. bu bölüm "raleigh" grubu hakkında konuştuğu yer - aynı teknik, host vars ve group vars için çalışıyor. Bunu çok kullanıyorum, tek varyasyon, eğer bir sır sadece bazı çalma kitapları için gerekliyse, onu farklı bir ağacın içinde saklamak ve ev sahibi ya da var ismi içeren bir yol aracılığıyla eklemek yararlı olabilir. - RichVel
Kasadaki 'ansible_ssh_pass' değerini şifrelediysem, bu nedenle 'ansible_sudo_pass' değerini de kopyalamam gerekiyor mu? İkinci sudo_pass değerinin ilk 'ssh_pass' değerini geri döndürmesinin bir yolu var mı? - emeraldjava


Ansible 1.5 ile ayarlamak mümkündür ansible_sudo_pass kullanarak değişken lookup('password', …):

ansible_sudo_pass: "{{ lookup('password', 'passwords/' + inventory_hostname) }}"

Bunu dosyaları kullanarak kullanmaktan daha kolay buluyorum host_vars/ birkaç nedenden dolayı:

  • Aslında kullanıyorum with_password: "passwords/{{ inventory_hostname}} encrypt=sha256_crypt" şifreleri sağlamak için dağıtmak uzak kullanıcı (daha sonra için gerekli olan sudo), bu yüzden dosyalarda zaten varlar (Bu düz metin aramaları yaparken de tuz değerini kaybeder karma değeri oluşturulduğunda dosyada saklanır).

  • Bu sadece dosyadaki şifreleri tutar (hayır ansible_sudo_pass: kriptografik güvenlikte bazı epsilon artışları için bilinen düz metin). Daha da önemlisi, diğer tüm ana bilgisayara özgü değişkenleri şifrelemediğiniz anlamına gelir. bu sayede kasa şifresi olmadan okunabilirler.

  • Parolaları ayrı bir dizine koymak, dosyaları kaynak denetiminden uzak tutmak veya benzeri bir araç kullanmayı kolaylaştırır. Git-crypt bunları şifrelenmiş biçimde saklamak için (bunu daha önceki Ansible ile birlikte kasa özelliğinden yoksun olarak kullanabilirsiniz). Git-crypt'i kullanıyorum ve şifrelenmiş dosya sistemlerinde sadece şifrelenmiş formdaki deposu kontrol ettiğimden, kasa ile uğraşmam ve bu yüzden bir kasa şifresi yazmam gerekmiyor. (Her ikisini de kullanmak elbette daha güvenli olur.)

Ayrıca kullanabilirsiniz yukarı Bak ile çalışmak ansible_ssh_pass; Bu, Ansible'ın daha önceki sürümleriyle mümkün olmayabilir. ansible_sudo_pass.


22
2018-05-26 19:33



ben en sonunda Bunu denemek için var (teşekkürler!), ama nasıl olacağını göremiyorum git-crypt; görebildiğim kadarıyla. Ansible gibi görünüyor henüz destek yok kullanmak için lookup şifreli bir kasada. password modül dokümanlar şifrelenmiş depolama için henüz henüz belgelenmemiş bir desteğin olduğunu söyleyin, ancak henüz detayları bulmuyorum. Herhangi bir ipucu? - supervacuo


kullanma pas sudo şifreleri ile ansible sağlamak için basit bir yöntemdir. pass, parolaları git veya diğer yöntemlerle paylaşmayı kolaylaştıran dosya başına bir parola depolar. Ayrıca (GnuPG kullanarak) güvenlidir ve gpg-agent kullanıyorsanız, her kullanımda bir parola girmeden ansible kullanmanıza izin verir.

Olarak saklanan şifreyi sağlamak servers/foo sunucu için foo ansible için, bunun gibi bir envanter dosyasında kullanın:

[servers]
foo ansible_sudo=True \
    ansible_sudo_pass="{{ lookup('pipe', 'pass servers/foo') }}"

Önceden gpg-agent için anahtarın kilidini açtığınız göz önüne alındığında, bu herhangi bir şifre girmeye gerek olmadan ansible çalışacaktır.


19
2018-01-19 19:51



Böyle mükemmel bir çözüm - teşekkürler! - Leng


Bu oldukça eski bir iş parçacığı, yine de:

  • Şirketimizde iki farklı kimlik doğrulama sistemi kullanıyoruz, makinelerin yönetimi ekibimdeki yerel iş istasyonlarından yapılmaktadır.
  • Yazdım vars_plugin Ansible için (oldukça eksiksiz bir uygulama bulunabilir. https://gist.github.com/mfriedenhagen/e488235d732b7becda81) birkaç kimlik doğrulama sistemini farklı kılar:
  • Kimlik doğrulama sisteminin adı gruba özgüdür.
  • Kullanılan giriş / sudo kullanıcısı grup ve yöneticiye özeldir.
  • Bu yüzden kullanıcıyı yönetici ortamından ve parola korumalı kütüphane aracılığıyla ilgili parolayı parola güvenliğinden alıyorum (Mac OS X'in anahtar zincirini kullanıyoruz, ancak Gnome belgelerinden ve Gnome ve _win_crypto'dan da destek alıyoruz).
  • Mac OS X'in anahtar zincirindeki parolalarda, bana komut satırı programı güvenlik tarafından kullanılan her kimlik doğrulama sistemi için bir parola erişim isteğinde bulunduğunu bildirmek için izinler belirledim Ana bilgisayarlar, bu yüzden "ansible -s all -m ping" komutunu çalıştırıyorum ve boşluk çubuğuna bastığım ve ansible şifreleri topladığım iki komut (her kimlik doğrulama sistemi için bir tane) aldım.

3
2018-03-03 17:33



Bu çok düzgün görünüyor, teşekkürler - Şifreleri iki yerde saklamak zorunda kalmama fikrini beğendim. Şu anda KeepassX kullanarak takılıyorum (çünkü GNOME anahtarlığı çok portatif görünmüyor) ama belki de python-keepass iş? - supervacuo
Anladığım kadarıyla, python-anahtarlığı bunun için bir soyutlamadır, bu yüzden meslektaşlarınız başka işletim sistemlerini kullanabilir. Veya keepassx db'nizi bir USB çubuğunda saklıyor ve farklı işletim sistemlerinde iş istasyonlarından yönetmeniz gerekiyor mu? - Mirko Friedenhagen
anladım; Ben GNOME olmayan sistemlerde parolalara erişebilmek için KeepassX'i kullanmak zorunda olduğum anlamına geliyordu. gnome-keyring çift ​​kayıtları tutmak anlamına gelir. Hala kullanmaktan daha güzel NOPASSWDolsa da… - supervacuo


Bunu yapmanın olası bir yolu çevresel değişkenleri kullanmaktır.

Örneğin.

pass1=foo pass2=bar ansible-playbook -i production servers.xml

Sonra oyunlarda sudo parolasını kullanarak aşağıdakileri kullanabilirsiniz:

lookup('env', 'pass1') 
lookup('env', 'pass2') 

0
2017-07-21 08:57