सूदो पास दिए जाने पर भी सूडो को प्रमाणित करने में असफल हो जाता है


9

मुसीबत

नवीनतम, स्थिर Ansible बिल्ड का उपयोग करते हुए, मुझे एक अजीब समस्या है, जहां मेरी प्लेबुक "Gathering_Facts" के दौरान एक सर्वर पर लटकाती है, लेकिन सूडो का उपयोग करते समय अन्य समान सर्वर पर ठीक काम करती है। Ansible सर्वर पर, मैं अपने उपयोगकर्ता (NIS उपयोगकर्ता) के रूप में चलता हूं और परिवर्तन करने के लिए दूरस्थ सर्वर पर sudo (रूट के रूप में ) का उपयोग करता हूं । अगर मैं सूडो को इस सेटअप से हटाता हूं, तो सब कुछ ठीक रहता है।

सेट अप

सॉफ्टवेयर संस्करण

  • ओएस : आरएचईएल 6.4
  • Ansible संस्करण : ansible 1.8.2
  • सूडो संस्करण :
    सूडो संस्करण 1.8.6p3
    सूडर्स पॉलिसी प्लगइन संस्करण 1.8.6p3
    सूदखोर व्याकरण संस्करण 42 फाइल करते हैं
    Sudoers I / O प्लगइन संस्करण 1.8.6p3
    
  • SSH संस्करण : OpenSSH_5.3p1, OpenSSL 1.0.0-fips 29 मार्च 2010

सर्वर का नक्शा

                   -------- User1 @ Server1: sudo -H -S -p (Gathering_Facts पर लटका)
                  /
User1 @ Ansible ----
                  \
                   -------- User1 @ Server2: sudo -H -S -p (वर्क्स ठीक)

उपयोगकर्ता

  • User1: सर्वर 1 और Server2 दोनों पर एनआईएस सुलभ उपयोगकर्ता।
  • रूट: प्रत्येक सर्वर के लिए स्थानीय रूट उपयोगकर्ता।

उत्तर देने योग्य विन्यास

मेरे ansible.cfg के प्रासंगिक हिस्से ।

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

यहां एक खाली फ़ाइल को छूने और फिर उसे निकालने के लिए एक सरल परीक्षण पुस्तिका है। वास्तव में, मैं बस परीक्षण करना चाहता हूं कि क्या मैं दूरस्थ सर्वर पर सुडो का सही ढंग से उपयोग करने के लिए अन्सिबल प्राप्त कर सकता हूं। अगर प्लेबुक बिल्कुल चलती है, तो मैं अच्छे आकार में हूं।

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

सूद विन्यास

/ Etc / sudoers

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

यह sudo कॉन्फ़िगरेशन BOTH सर्वर पर ठीक काम करता है। खुद सूडो से कोई समस्या नहीं।

मैं यह सब कैसे चलाते हैं

बहुत आसान:

$ asible-playbook test.yml
SSH पासवर्ड: 
sudo पासवर्ड [SSH पासवर्ड में चूक]:

प्ले [सर्वर 1: सर्वर 2] ******************************* ** 

परिचारिकाएं ******************************* *************** 
ठीक है: [Server2]
विफल: [Server1] => {"विफल": सच, "पार्स": असत्य}

क्षमा करें दोबारा प्रयास कीजिये।
[sudo asible, key = mxxiqyvztlfnbctwixzmgvhwfdarumtq] पासवर्ड के माध्यम से: 
sudo: 1 गलत पासवर्ड का प्रयास


TASK: [कनेक्टिविटी और sudo एक्सेस का परीक्षण करने के लिए खाली फ़ाइल बनाएं] **************** 
परिवर्तित: [Server2]

नोट: [साफ] ***************************** **************** 
परिवर्तित: [Server2]

PLAY RECAP ************************************* ******************** 
           पुनः प्रयास करने के लिए, का उपयोग करें: - @ @ घर / User1 / test.retry

सर्वर 1: ठीक = 0 परिवर्तित = 0 अप्राप्य = 0 विफल = 1   
Server2: ok = 3 परिवर्तित = 2 अप्राप्य = 0 विफल = 0

अगर मैं स्पष्ट रूप से एसएसएच / सूडो दोनों पासवर्ड के साथ-साथ अंतर्निहित रूप से प्रवेश करता हूं, तो इसमें विफल रहता है (सूडो एसएसएच के लिए डिफ़ॉल्ट रूप से पास होने देता है)।

रिमोट सर्वर लॉग

सर्वर 1 (विफल)

/ Var / log / सुरक्षित

31 दिसंबर 15:21:10 Server1 sshd [27093]: xxxx पोर्ट 51446 ssh2 से User1 के लिए स्वीकृत पासवर्ड
31 दिसंबर 15:21:10 Server1 sshd [27093]: pam_unix (sshd: session): उपयोगकर्ता द्वारा उपयोगकर्ता के लिए खोला गया सत्र (uid = 0)
31 दिसंबर 15:21:11 Server1 sshd [27095]: sftp के लिए सबसिस्टम अनुरोध
31 दिसंबर 15:21:11 Server1 sudo: pam_unix (sudo: cort): प्रमाणीकरण विफलता; logname = User1 uid = 187 euid = 0 tty = / dev / pts / 1 ruser = उपयोगकर्ता 1 rhost = उपयोगकर्ता = उपयोगकर्ता 1
31 दिसंबर 15:26:13 Server1 sudo: pam_unix (sudo: cort): बातचीत विफल रही
31 दिसंबर 15:26:13 Server1 sudo: pam_unix (sudo: cort): सेकंड पासवर्ड के लिए पासवर्ड की पहचान नहीं कर सका]
31 दिसंबर 15:26:13 Server1 sudo: User1: 1 गलत पासवर्ड प्रयास; TTY = pts / 1; PWD = / home / User1; USER = जड़; COMMAND = / bin / sh -c echo 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 दिसंबर 15:26:13 Server1 sshd [27093]: pam_unix (sshd: session): उपयोगकर्ता User1 के लिए सत्र बंद 

Server2 (ठीक चलता है)

/ Var / log / सुरक्षित

31 दिसंबर 15:21:12 Server2 sshd [31447]: xxxx पोर्ट 60346 ss2 से User1 के लिए स्वीकृत पासवर्ड
31 दिसंबर 15:21:12 Server2 sshd [31447]: pam_unix (sshd: session): उपयोगकर्ता द्वारा उपयोगकर्ता के लिए खोला गया सत्र (uid = 0)
31 दिसंबर 15:21:12 Server2 sshd [31449]: sftp के लिए सबसिस्टम अनुरोध
31 दिसंबर 15:21:12 Server2 sudo: User1: TTY = pts / 2; PWD = / home / User1; USER = जड़; COMMAND = / bin / sh -c echo 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 दिसंबर 15:21:14 Server2 sshd [31447]: pam_unix (sshd: session): उपयोगकर्ता User1 के लिए सत्र बंद 

स्ट्रेस आउटपुट

यहां रूट उपयोक्ता के कमांड कमांड को स्ट्रेस से आउटपुट दिया गया है। कमान:

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`

Server1

23650 सेलेक्ट (0, NULL, NULL, NULL, {1, 508055}) = 0 (टाइमआउट)
23650 सॉकेट (PF_NETLINK, SOCK_RAW, 9) = 10
23650 fcntl (10, F_SETFD, FD_CLOEXEC) = 0
23650 रीडलिंक ("/ proc / स्व / निर्वासन", "/ usr / बिन / sudo", 4096) = 13
23650 Sendto (10, "| \ 0 \ 0 \ 0L \ 4 \ 5 \ 0 \ 1 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0op = PAM: प्रामाणिक" ..., 124, 0, {sa_famY = AF_NETLINK, pid = 0, समूह = 00000000}, 12) = 124
23650 पोल ([{fd = 10, इवेंट = POLLIN}], 1, 500) = 1 ([{fd = 10, revents = POLLIN}])
23650 पुनरावृत्ति (10, "$ \ 0 \ 0 \ 0 \ 2 \ 0 \ 0 \ 0 \ 1 \ 0 \ 0 \ 0b \\\ 0 \ 0 \ 0 \ 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, group = 00000000}, [12]) = 36
23650 पुनरावृत्ति (10, "$ \ 0 \ 0 \ 0 \ 2 \ 0 \ 0 \ 0 \ 1 \ 0 \ 0 \ 0b \\\ 0 \ 0 \ 0 \ 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, समूह = 00000000}, [12]) [36]
23650 पास (10) = 0
23650 लिखें (2, "क्षमा करें, पुन: प्रयास करें। \ n", 18) = 18
23650 गेटटाइमऑफडे ({1420050850, 238344}, NULL) = 0
23650 सॉकेट (PF_FILE, SOCK_STREAM, 0) = 10
23650 कनेक्ट (10, {sa_family = AF_FILE, path = "/ var / run / dbus / system_bus_socket"}, 33) = 0

Server2

6625 चयन (8, [5 7], [], NULL, NULL) =? ERESTARTNOHAND (पुनः आरंभ किया जाना)
६६२५ --- सिगल्डएलडी (बच्चा बाहर) @ ० (०) ---
6625 लिखना (8, "\ 21", 1) = 1
6625 rt_sigreturn (0x8) = -1 EINTR (बाधित सिस्टम कॉल)
6625 चयन (8, [5 7], [], NULL, NULL) = 1 ([7] में)
6625 पढ़ा (7, "\ 21", 1) = 1
6625 प्रतीक्षा 4 (6636, [{WIFEXITED (s) && WEXITSTATUS (s) == 0}], WNOHANG | WSTOPPED, NULL) = 6636
6625 rt_sigprocmask (SIG_BLOCK, NULL, [], 8) = 0
6625 सॉकेट (PF_NETLINK, SOCK_RAW, 9) = 6
6625 fcntl (6, F_SETFD, FD_CLOEXEC) = 0
6625 रीडलिंक ("/ 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 \ 0 \ 0 \ 0op = PAM: session_c" ..., 120, 0, {sa_amamily] = AF_NETLINK, pid = 0, समूह = 00000000}, 12) = 120
6625 पोल ([{fd = 6, इवेंट्स = POLLIN}], 1, 500) = 1 ([{fd = 6, revents = POLLIN}])
6625 रिकवरफ्रॉम (6, "$ \ 0 \ 0 \ 0 \ 2 \ 0 \ 0 \ 0 \ 6 \ 0 \ 0 \ 0 \ 0 \ 330 \ 355 \ 377 \ 377 \ 377 \ 0 \ 0 \ 0 \ 0x \ 0 \ 0 \ \) 0R \ 4 \ 5 \ 0 \ 6 \ 0 \ 0 \ 0 \ "..., 8988, MSG_PE44 / MSG_DONTWAIT, {sa_family = AF_NETLINK, pid = 0, group =0000}, [12]) = 36
6625 रिकवरफ्रॉम (6, "$ \ 0 \ 0 \ 0 \ 2 \ 0 \ 0 \ 0 \ 6 \ 0 \ 0 \ 0 \ 0 \ 330 \ 355 \ 377 \ 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, समूह = 00000000}, [12]] = 36
6625 पास (6) = 0
6625 खुला ("/ etc / सुरक्षा / 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_size = 8_state)। = 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 पढ़ा (6, "# \ n # यह कॉन्फ़िगरेशन फाई है" ..., 4096) = 2980
6625 पढ़ा (6, "", 4096) = 0
6625 पास (6) = 0
6625 मूनमैप (0x7fbc3a59a000, 4096) = 0
6625 खुला ("/ etc / पर्यावरण", O_RDONLY) = 6

मेरा अनुमान

Server1 को ठीक से पासवर्ड नहीं मिल रहा है या गलत तरीके से पासवर्ड के लिए पूछ रहा है / इंतजार कर रहा है। यह सूडो या अन्सिबल समस्या (अकेले, वे दोनों ठीक काम करते हैं) की तरह नहीं दिखता है, लेकिन Server1 को सर्वर 2 के समान रूप में क्रेडेंशियल्स (या उनका पालन करना) प्राप्त नहीं होता है। Server1 और 2 विभिन्न उद्देश्यों की पूर्ति करते हैं, इसलिए यह संभव है कि उनके पास कुछ प्रमाणीकरण या पैकेज संस्करण अंतर हैं, लेकिन वे दोनों एक ही भंडार से निर्मित थे; इसलिए, उन्हें अलग नहीं होना चाहिए।

PAM प्रामाणिक

मैंने सोचा कि शायद सिस्टम में अलग-अलग PAM कॉन्फ़िगरेशन थे, जिससे पासवर्ड को थोड़ा अलग तरीके से हैंडल किया जा सकता था। मैंने /etc/pam.d/ फ़ाइलों (उपयोग करने md5sum [file]) की तुलना की , और वे दोनों प्रणालियों के बीच समान हैं।

टेस्ट

सूदो STDIN

एक अन्य मुद्दे का परीक्षण किया, जहां सूडान एसटीडीआईएन से पासवर्ड नहीं पढ़ेगा, लेकिन दोनों सर्वरों पर ठीक काम किया।

टेस्ट सुडो एड-हॉक

-Bash-4.1 $ ansible Server1 -m फ़ाइल -a "dest = / tmp / ansible_test.txt राज्य = स्पर्श" -sK
SSH पासवर्ड: 
sudo पासवर्ड [SSH पासवर्ड में चूक]: 
सर्वर 1 | सफलता >> {
    "परिवर्तित": सच, 
    "डेस्ट": "/tmp/ansible_test.txt", 
    "गिद": 0, 
    "समूह": "जड़", 
    "मोड": "0644", 
    "स्वामी": "जड़", 
    "आकार": 0, 
    "राज्य": "फ़ाइल", 
    "यूआईडी": 0
}

सफलता! लेकिन क्यों?!

टी एल; डॉ

  1. Server1 sudo पासवर्ड प्रॉम्प्ट पर प्रतीक्षा कर रहा है, जबकि Server2 ठीक चलता है।
  2. ansibleServer1 पर "एड-हॉक" चलाना ठीक काम करता है। इसे प्लेबुक के रूप में चलाना विफल हो जाता है।

प्रशन)

  • एक सर्वर पर ठीक काम करने और दूसरे पर अस्वीकार किए जाने के कारण मेरे Ansible Sudo कॉन्फ़िगरेशन क्या हो सकता है?
  • क्या स्थानीय और दूरस्थ मशीन से अलग-अलग तरीके से एड-हॉक बनाम प्लेबुक चलाते समय Ansible पासवर्ड करता है? मैंने मान लिया कि वे वही होंगे।

मुझे लगता है कि यह पूरी तरह से इस तथ्य पर विशुद्ध रूप से GitHub पृष्ठ पर एक बग रिपोर्ट प्रस्तुत करने के करीब हो रहा है कि सुडोकू उपयोग के अलग-अलग परिणाम हैं यदि मैं तदर्थ चला रहा हूं या नहीं।

जवाबों:


4

मैं क्या करना है का उपयोग करने के लिए है

strace -vfp `pidof sshd`

और देखें कि यह कहाँ विफल हो रहा है।

खाते की जाँच करें, शायद यह प्रतिबंधित है या कुछ और है, लेकिन मेरी शर्त यह है कि आपके / etc / होस्ट फ़ाइल में कुछ गड़बड़ है या यह प्रक्रिया में परिवर्तित हो गया है।


धन्यवाद, लुलियन। मैंने प्रश्न के लिए कुछ संपादन लागू किए हैं, एक खंड का उत्पादन किया जा रहा है। यह स्पष्ट है कि दो सर्वरों के बीच अंतर है कि कैसे वे सुगम प्रक्रिया को रिमोट सर्वर पर बंद करने के बाद आगे बढ़ते हैं। इसके बाद के रन और ट्रेस कैच लगातार थे।
BrM13

मुझे लगता है कि आपको उस स्ट्रेस -vfp से अधिक की आवश्यकता है, इसे मैन्युअल रूप से शीर्ष sshd प्रक्रिया पर करें और आउटपुट के माध्यम से पालन करें। मुझे नहीं लगता कि पासवर्ड को पढ़ने के बाद यह सिर्फ उस चैनल को बंद कर रहा है जैसे पीएएम आदि से गुजरने से पहले। उस बिंदु पर कृपया sshd_config फ़ाइल और होस्टेसडेन पर एक नज़र डालें। देखें कि क्या आपको वहां कुछ मिल सकता है।
इलियान

मैंने पहले भी आपके सुझाव की कोशिश की थी, लेकिन मुझे वहाँ महत्वपूर्ण तत्व याद आ गया होगा (इसलिए मैंने प्रारंभिक प्रक्रिया में ansible प्रक्रिया को देखने का विकल्प क्यों चुना)। एक और जाने के बाद, मुझे असली पासवर्ड की जगह एक खाली {{पासवर्ड}} चर मिला। अपने जवाब के बाद से एक और "उत्तर" अलग से प्रस्तुत करने का विकल्प चुना।
BrM13

4

इस उत्तर में @lulian को एक पायदान के रूप में उपयोग करते हुए, समस्या ansible_sudo_pass:Group_vars में परिभाषित एक बदमाश के लिए नीचे आ गई, जो पासवर्ड के लिए दर्ज किया गया था --ask-sudo-pass

निम्नलिखित का उपयोग करना:

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)दर्ज पासवर्ड के बजाय पारित किया जा रहा था। कुछ त्वरित खोज के बाद, मैंने वास्तव ansible_sudo_passमें अपने group_vars में परिभाषित पाया जो मेरे दर्ज पासवर्ड को ओवरराइड कर रहा था।

सभी के लिए एक FYI के रूप में, ansible_sudo_pass:परिभाषा --ask-sudo-passपहले से अधिक सहज ज्ञान युक्त लग रहा था, जिस पर वरीयता लेने के लिए लगता है । अंत में, यह उपयोगकर्ता त्रुटि है, लेकिन @ lulian की कार्यप्रणाली SSH इंटरैक्शन को डिबग करने के साथ-साथ बीच के रिश्ते की खोज में ansible_sudo_passऔर --ask-sudo-passदूसरों के लिए बहुत उपयोगी होनी चाहिए। (उम्मीद है कि!)


1
मैं तर्क देता हूं कि कमांड लाइन विकल्पों पर फाइल-डिफाइंड चर के लिए एंज़िबिलिटी देने से पहले , काउंटर-सहज और बुरा व्यवहार होता है। उत्सुकता से, यह पहचानता है कि जब आप के साथ विकल्प पास करते हैं तो यह टूट जाता है -e, और आप इसके साथ एक उपयुक्त विकल्प पास करके काम करने में सक्षम हो सकते हैं -e
क्रिस्टोफर Cashell
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.