Sudo Pass Verilse Bile Anso, Sudo'nun Kimliğini Doğrulayamıyor


9

Sorun

En son, kararlı Ansible yapısını kullanarak, oyun kitabım "Gathering_Facts" sırasında bir sunucuda asılı ama Sudo kullanırken diğer benzer sunucularda iyi çalışıyor garip bir sorun var. Ansible sunucusunda, kullanıcı (NIS kullanıcısı) olarak çalıştırıyorum ve değişiklik yapmak için uzak sunucuda sudo (root olarak) kullanıyorum . Sudo'yu bu kurulumdan kaldırırsam, her şey iyi çalışır.

Kurmak

Yazılım Sürümleri

  • İşletim Sistemi : RHEL 6.4
  • Makul sürüm : ansible 1.8.2
  • Sudo sürümü :
    Sudo sürüm 1.8.6p3
    Sudoers Policy Plugin Sürüm 1.8.6p3
    Sudoers dosya gramer sürümü 42
    Sudoers I / O eklentisi sürüm 1.8.6p3
    
  • SSH sürümü : OpenSSH_5.3p1, OpenSSL 1.0.0-fips 29 Mar 2010

Sunucu Haritası

                   -------- Kullanıcı1 @ Sunucu1: sudo -H -S -p (Toplama_Fabriklerine Asılır)
                  /
Kullanıcı1 @ Ansible ----
                  \
                   -------- Kullanıcı1 @ Sunucu2: sudo -H -S -p (İyi çalışıyor)

Kullanıcılar

  • Kullanıcı1: Sunucu1 ve Sunucu2 üzerinde NIS erişimli kullanıcı.
  • root: her sunucu için yerel kök kullanıcı.

Uygun Yapılandırma

Ansible.cfg dosyamın ilgili bölümleri .

ansible.cfg

sudo           = true
sudo_user      = root
ask_sudo_pass  = True
ask_pass       = True
...
gathering = smart
....
# change this for alternative sudo implementations
sudo_exe = sudo

# what flags to pass to sudo
#sudo_flags = -H
...
# remote_user = ansible

Boş bir dosyaya dokunup kaldırmak için basit bir test oyun kitabı. Gerçekten, Ansible'ın uzak sunucuda sudo'yu doğru şekilde kullanıp kullanamayacağımı test etmek istiyorum. Başucu kitabı çalışırsa iyi durumdayım.

TEST.yml

---
- hosts: Server1:Server2
  vars:
  - test_file: '/tmp/ansible_test_file.txt'
  sudo: yes
  tasks:
  - name: create empty file to test connectivity and sudo access
    file: dest={{ test_file }}
          state=touch
          owner=root group=root mode=0600
    notify:
    - clean
  handlers:
  - name: clean
    file: dest={{ test_file }}
          state=absent

Sudo Yapılandırması

/ Etc / Sudoers

Host_Alias SRV     = Server1, Server2
User_Alias SUPPORT = User1, User2, User3
SUPPORT SRV=(root) ALL

Bu sudo yapılandırması, BOTH sunucularında iyi çalışır. Sudo ile ilgili sorun yok.

Hepsini Nasıl Çalıştırırım

Çok basit:

$ ansible-playbook test.yml
SSH şifresi: 
sudo password [varsayılan olarak SSH password]:

OYNA [Sunucu1: Sunucu2] ******************************************** ** 

TOPLANTI GERÇEKLERİ ************************************************ *************** 
tamam: [Sunucu2]
başarısız oldu: [Sunucu1] => {"başarısız oldu": doğru, "ayrıştırıldı": yanlış}

Üzgünüm, tekrar dene.
[sudo via ansible, anahtar = mxxiqyvztlfnbctwixzmgvhwfdarumtq] şifre: 
sudo: 1 yanlış şifre girişimi


GÖREV: [bağlantı ve sudo erişimini test etmek için boş bir dosya oluşturun] **************** 
değiştirildi: [Sunucu2]

NOTIFIED: [temiz] ********************************************* **************** 
değiştirildi: [Sunucu2]

PLAY RECAP ************************************************ ******************** 
           yeniden denemek için şunu kullanın: --limit @ / home / User1 / test.retry

Sunucu1: ok = 0 değişti = 0 ulaşılamıyor = 0 başarısız oldu = 1   
Sunucu2: ok = 3 değişti = 2 ulaşılamıyor = 0 başarısız = 0

Hem SSH / Sudo parolalarını hem de dolaylı olarak (sudo'nun SSH'ye varsayılan olarak geçmesine izin vererek) açıkça girersem de başarısız olur.

Uzak Sunucu Günlükleri

Sunucu1 (Başarısız)

/ Var / log / güvenli

31 Aralık 15:21:10 Server1 sshd [27093]: xxxx bağlantı noktası 51446 ssh2'den User1 için kabul edilen şifre
31 Aralık 15:21:10 Sunucu1 sshd [27093]: pam_unix (sshd: session): User1 kullanıcısı için oturum açıldı (uid = 0)
Aralık 31 15:21:11 Sunucu1 sshd [27095]: sftp için alt sistem isteği
31 Aralık 15:21:11 Sunucu1 sudo: pam_unix (sudo: auth): kimlik doğrulama hatası; logname = Kullanıcı1 uid = 187 euid = 0 tty = / dev / pts / 1 ruser = Kullanıcı1 rhost = kullanıcı = Kullanıcı1
31 Aralık 15:26:13 Sunucu1 sudo: pam_unix (sudo: auth): konuşma başarısız
31 Aralık 15:26:13 Sunucu1 sudo: pam_unix (sudo: auth): auth [Kullanıcı1] için şifre tanımlayamadı
31 Aralık 15:26:13 Sunucu1 sudo: Kullanıcı1: 1 yanlış şifre girişimi; TTY = pts / 1; PWD = / ana sayfa / Kullanıcı1; KULLANICI = kök; KOMUT = / bin / sh -c yankı SUDO-SUCCESS-mxxiqyvztlfnbctwixzmgvhwfdarumtq; LANG = C LC_CTYPE = C / usr / bin / python /tmp/.ansible/tmp/ansible-tmp-1420039272.66-164754043073536/setup; rm -rf /tmp/.ansible/tmp/ansible-tmp-1420039272.66-164754043073536/> / dev / null 2> & 1
31 Aralık 15:26:13 Sunucu1 sshd [27093]: pam_unix (sshd: session): kullanıcı1 için oturum kapatıldı 

Sunucu2 (iyi çalışır)

/ Var / log / güvenli

31 Aralık 15:21:12 Server2 sshd [31447]: xxxx bağlantı noktası 60346 ssh2'den User1 için kabul edilen şifre
31 Aralık 15:21:12 Sunucu2 sshd [31447]: pam_unix (sshd: session): User1 kullanıcısı için oturum açıldı (uid = 0)
Aralık 31 15:21:12 Sunucu2 sshd [31449]: sftp için alt sistem isteği
31 Aralık 15:21:12 Sunucu2 sudo: Kullanıcı1: TTY = pts / 2; PWD = / ana sayfa / Kullanıcı1; KULLANICI = kök; KOMUT = / bin / sh -c yankı SUDO-SUCCESS-vjaypzeocvrdlqalxflgcrcoezhnbibs; LANG = C LC_CTYPE = C / usr / bin / python /tmp/.ansible/tmp/ansible-tmp-1420039272.68-243930711246149/setup; rm -rf /tmp/.ansible/tmp/ansible-tmp-1420039272.68-243930711246149/> / dev / null 2> & 1
31 Aralık 15:21:14 Server2 sshd [31447]: pam_unix (sshd: session): kullanıcı1 için oturum kapatıldı 

STrace Çıkışı

Kök kullanıcının ansible komutunu hedeflerken strace çıktısı. Komut:

while [[ -z $(ps -fu root|grep [a]nsible|awk '{print $2}') ]]; do
    continue
done
strace -vfp $(ps -fu root|grep [a]nsible|awk '{print $2}') -o /root/strace.out`

Sunucu 1

23650 seçim (0, NULL, NULL, NULL, {1, 508055}) = 0 (Zaman Aşımı)
23650 soket (PF_NETLINK, SOCK_RAW, 9) = 10
23650 fcntl (10, F_SETFD, FD_CLOEXEC) = 0
23650 readlink ("/ proc / self / exe", "/ usr / bin / sudo", 4096) = 13
23650 sendto (10, "| \ 0 \ 0 \ 0L \ 4 \ 5 \ 0 \ 1 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0op = PAM: otantik" ..., 124, 0, {sa_family = AF_NETLINK, pid = 0, gruplar = 00000000}, 12) = 124
23650 anket ([{fd = 10, olaylar = POLLIN}], 1, 500) = 1 ([{fd = 10, revents = POLLIN}])
23650 recvfrom (10, "$ \ 0 \ 0 \ 0 \ 2 \ 0 \ 0 \ 0 \ 1 \ 0 \ 0 \ 0 \ 0b \\\ 0 \ 0 \ 0 \ 0 \ 0 \ 0 | \ 0 \ 0 \ 0L \ 4 \ 5 \ 0 \ 1 \ 0 \ 0 \ 0 "..., 8988, MSG_PEEK | MSG_DONTWAIT, {sa_family = AF_NETLINK, pid = 0, gruplar = 00000000}, [12]) = 36
23650 recvfrom (10, "$ \ 0 \ 0 \ 0 \ 2 \ 0 \ 0 \ 0 \ 1 \ 0 \ 0 \ 0 \ 0b \\\ 0 \ 0 \ 0 \ 0 \ 0 \ 0 | \ 0 \ 0 \ 0L \ 4 \ 5 \ 0 \ 1 \ 0 \ 0 \ 0 "..., 8988, MSG_DONTWAIT, {sa_family = AF_NETLINK, pid = 0, gruplar = 00000000}, [12]) = 36
23650 yakın (10) = 0
23650 write (2, "Üzgünüm, tekrar deneyin. \ N", 18) = 18
23650 gettimeofday ({1420050850, 238344}, NULL) = 0
23650 soket (PF_FILE, SOCK_STREAM, 0) = 10
23650 bağlantı (10, {sa_family = AF_FILE, yol = "/ var / run / dbus / system_bus_socket"}, 33) = 0

Sunucu2

6625 seçin (8, [5 7], [], NULL, NULL) =? ERESTARTNOHAND (Yeniden başlatılacak)
6625 - SIGCHLD (Çocuk çıkıldı) @ 0 (0) ---
6625 yazma (8, "\ 21", 1) = 1
6625 rt_sigreturn (0x8) = -1 EINTR (Kesilmiş sistem çağrısı)
6625 seçim (8, [5 7], [], NULL, NULL) = 1 ([7] 'de)
6625 okuma (7, "\ 21", 1) = 1
6625 wait4 (6636, [{WIFEXITED (s) && WEXITSTATUS (s) == 0}], WNOHANG | WSTOPPED, NULL) = 6636
6625 rt_sigprocmask (SIG_BLOCK, NULL, [], 8) = 0
6625 soket (PF_NETLINK, SOCK_RAW, 9) = 6
6625 fcntl (6, F_SETFD, FD_CLOEXEC) = 0
6625 readlink ("/ proc / self / exe", "/ usr / bin / sudo", 4096) = 13
6625 sendto (6, "x \ 0 \ 0 \ 0R \ 4 \ 5 \ 0 \ 6 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0op = PAM: session_c" ..., 120, 0, {sa_family = AF_NETLINK, pid = 0, gruplar = 00000000}, 12) = 120
6625 anket ([{fd = 6, olaylar = POLLIN}], 1, 500) = 1 ([{fd = 6, revents = POLLIN}])
6625 recvfrom (6, "$ \ 0 \ 0 \ 0 \ 2 \ 0 \ 0 \ 0 \ 6 \ 0 \ 0 \ 0 \ 330 \ 355 \ 377 \ 377 \ 0 \ 0 \ 0 \ 0x \ 0 \ 0 \ 0R \ 4 \ 5 \ 0 \ 6 \ 0 \ 0 \ 0 "..., 8988, MSG_PEEK | MSG_DONTWAIT, {sa_family = AF_NETLINK, pid = 0, gruplar = 00000000}, [12]) = 36
6625 recvfrom (6, "$ \ 0 \ 0 \ 0 \ 2 \ 0 \ 0 \ 0 \ 6 \ 0 \ 0 \ 0 \ 330 \ 355 \ 377 \ 377 \ 0 \ 0 \ 0 \ 0x \ 0 \ 0 \ 0R \ 4 \ 5 \ 0 \ 6 \ 0 \ 0 \ 0 "..., 8988, MSG_DONTWAIT, {sa_family = AF_NETLINK, pid = 0, gruplar = 00000000}, [12]) = 36
6625 yakın (6) = 0
6625 açık ("/ etc / security / pam_env.conf", O_RDONLY) = 6
6625 fstat (6, {st_dev = makedev (253, 1), st_ino = 521434, st_mode = S_IFREG | 0644, st_nlink = 1, st_uid = 0, st_gid = 0, st_blksize = 4096, st_blocks = 8, st_uid = 2980, st_atime = 2014/12 / 31-16: 10: 01, st_mtime = 2012/10 / 15-08: 23: 52, st_ctime = 2014/06 / 16-15: 45: 35}) = 0
6625 mmap (NULL, 4096, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0) = 0x7fbc3a59a000
6625 okuma (6, "# \ n # Bu fi yapılandırması" ..., 4096) = 2980
6625 okuma (6, "", 4096) = 0
6625 yakın (6) = 0
6625 munmap (0x7fbc3a59a000, 4096) = 0
6625 açık ("/ etc / environment", O_RDONLY) = 6

Tahminimce

Sunucu1 şifreyi düzgün almıyor veya yanlış bir şifre istiyor / bekliyor. Bu bir Sudo veya Ansible sorununa benzemiyor (tek başına, ikisi de gayet iyi çalışıyor), ancak Server1 kimlik bilgilerini Server2 ile aynı şekilde almıyor (veya onlara uyuyor). Sunucu1 ve 2 farklı amaçlara hizmet eder, bu nedenle bazı kimlik doğrulama veya paket sürüm farklılıklarına sahip olmaları mümkündür, ancak her ikisi de aynı depodan oluşturulmuştur; bu nedenle, bunlar farklı olmamalıdır.

PAM Yetkilendirme

Belki de sistemlerin farklı PAM konfigürasyonları olduğunu ve şifrelerin biraz farklı bir şekilde ele alınmasına neden olduğunu düşündüm. /Etc/pam.d/ dosyalarını (kullanarak md5sum [file]) karşılaştırdım ve bunlar iki sistem arasında aynı.

Testler

Sudo STDIN

Sudo'nun STDIN'den bir parola okumaması, ancak her iki sunucuda da iyi çalıştığı başka bir sorunu test etti.

Sudo Ad-Hoc'u test et

-bash-4.1 $ ansible Server1 -m dosyası -a "dest = / tmp / ansible_test.txt durumu = dokunma" -sK
SSH şifresi: 
sudo password [varsayılan olarak SSH password]: 
Sunucu1 | başarı >> {
    "değiştirildi": doğru, 
    "dest": "/tmp/ansible_test.txt", 
    "gid": 0, 
    "grup": "kök", 
    "mod": "0644", 
    "owner": "kök", 
    "boyut": 0, 
    "state": "dosya", 
    "uid": 0
}

Başarı! Ama neden?!

TL; DR

  1. Server2 gayet iyi çalışırken Server1 sudo şifre isteminde bekliyor gibi görünüyor.
  2. Koşu ansibleSunucu1'i "anlık" cezası çalışır. Bir oynatma kitabı olarak çalıştırmak başarısız olur.

Soru (lar)

  • Ansible Sudo yapılandırmamın bir sunucuda düzgün çalışmasına ve başka bir sunucuda reddedilmesine ne sebep olabilir?
  • Ansible, ad-hoc ve playbook'u çalıştırırken yerelden uzak makineye "geçiş" şifresini farklı mı yapıyor? Onların aynı olacağını varsaymıştım.

Bu sadece GitHub sayfasına bir hata raporu göndermeye yakınlaştığını düşünüyorum, sadece sudo erişiminin ad-hoc çalıştırıp çalıştırmamaya bağlı olarak farklı sonuçlara sahip olması gerçeğine bağlı.

Yanıtlar:


4

Yapacağım şey kullanmak

strace -vfp `pidof sshd`

ve nerede başarısız olduğunu görün.

Hesabı da kontrol edin, belki kısıtlı veya başka bir şey ama bahse girerim / etc / hosts dosyanızla ilgili bir sorun var veya işlem sırasında değişiyor.


Teşekkürler, lulian. Soruda birkaç düzenleme uyguladım, bir bölüm STrace çıktısıydı. İki sunucu arasında, ansible işlem uzak sunucuda başlatıldıktan sonra nasıl ilerleyecekleri konusunda bir fark olduğu açıktır. Müteakip koşu ve eser yakalama tutarlıydı.
BrM13

Sanırım bu strace -vfp'den daha fazlasına ihtiyacınız var, üst sshd işleminde manuel olarak yapın ve çıktıyı takip edin. Ben şifre okuduktan sonra sadece PAM vb geçmeden önce böyle kapanıyor sanmıyorum. Bu noktada lütfen sshd_config dosya ve hosts.deny bir göz atın .. orada bir şey bulabilir misin bakın.
Iulian

Daha önce öneriyi denemiştim, ama oradaki önemli unsuru kaçırmış olmalıydım (bu yüzden ilk STrace'teki sorumlu süreci izlemeyi tercih ettim). Başka bir gittikten sonra, gerçek şifre yerine boş bir {{password}} değişkeninin geçmekte olduğunu gördüm. Cevabınız beni doğru yolda izlediğinden ayrı olarak başka bir "Cevap" göndermeyi seçti.
BrM13

4

@Lulian bu cevapta bir dayanak noktası olarak kullanıldığında, problem ansible_sudo_pass:group_vars içinde tanımlanan ve girilen şifreyi geçersiz kılan bir hileye indi --ask-sudo-pass.

Aşağıdakileri kullanarak:

while [[ -z $(ps -eaf|grep 'sshd: [U]ser1@pts/1') ]]; do
    continue
done
strace -ff -vfp $(ps -eaf|grep 'sshd: [U]ser1@pts/1'|awk '{print $2}') -o /root/strace_sshd1_2.out

write(4, "{{ password }}\n", 15)Girilen şifre yerine bunun geçtiğini bulabildim . Biraz hızlı arama yaptıktan sonra, ansible_sudo_passgirilen şifremi geçersiz kılan benim group_vars tanımlanmış buldum.

Herkes için bir FYI olarak, ansible_sudo_pass:tanım --ask-sudo-passilk başta karşı sezgisel gibi görünen bir önceliğe sahip gibi görünüyor. Sonunda, bu kullanıcı hatasıdır, ancak @ lulian'ın SSH etkileşimini ansible_sudo_passve aralarındaki ilişki keşfinin hatalarını ayıklamadaki metodolojisi ve --ask-sudo-passdiğer insanlar için çok yararlı olmalıdır. (İnşallah!)


1
Ben yanıtlayıcı 'komut satırı seçenekleri üzerinde dosya tanımlı değişkenlere öncelik vererek iddia ediyorum olduğu karşı-sezgisel ve kötü davranış. İlginçtir ki, seçenekleri ilettiğinizde bunun bozulduğunu fark eder -eve uygun bir seçeneği geçerek bu sorunu çözebilirsiniz -e.
Christopher Cashell
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.