ใครเป็นผู้เริ่มต้น ssh-agent ของฉันและทำไมมันถึงไม่จบอย่างถูกต้อง?


9

นี่เป็นปัญหาที่ฉันมีมาเป็นเวลานาน แต่ทุกครั้งที่ฉันพยายามคิดอะไรบางอย่างที่ฉันหลงทางดังนั้นฉันจึงคิดว่าฉันควรถามที่นี่ว่าอาจมีใครบางคนที่มีประสบการณ์มากกว่าสามารถช่วยฉันได้

พื้นหลัง

Raspberry Pi ของฉันใช้ Raspbian Jessie และฉันใช้ SSH บ่อยครั้งเพื่อเข้าสู่ระบบและรันคำสั่งจากระยะไกล ในระหว่างช่วง SSH ครั้งแรกของฉันฉันสังเกตเห็นว่าssh-agentกระบวนการเกิดขึ้นที่ RPiทุกครั้งที่ฉันเข้าสู่ระบบ แต่ไม่เคยถูกฆ่าตายเมื่อexitเข้า: เข้าสู่ระบบออกหลายครั้งทำให้ssh-agentกระบวนการหลายอย่างเกิดขึ้นโดยไม่ต้องทำอะไรเลย เล่นไปรอบ ๆ และอ่านหน้าคนและคำตอบที่นี่และที่นั่นฉันเพิ่งเข้าใจวัตถุประสงค์ของการssh-agentและฉันก็รู้ว่ามันควรจะถูกฆ่าตามปกติเมื่อออกจากระบบดังนั้นฉันเริ่มถามตัวเองว่าทำไมมันไม่ นอกจากนี้ฉันสังเกตเห็นว่าการออกตัวsource ~/.bashrcทำให้เกิดอีกตัวอย่างของssh-agentการเกิด ฉันอ่านหน้าญาติSSH_AGENT_PIDควรกำหนดตัวแปรสภาพแวดล้อมเนื่องจากssh-agentโปรแกรมควรเริ่มทำงานภายในevalเพื่อประมวลผลเอาต์พุตและกำหนดตัวแปรดังกล่าวซึ่งจะถูกใช้โดยคำสั่งที่เกี่ยวข้องกับ SSH อื่น ๆ รวมถึงssh-agent -k(เพื่อฆ่าเอเจนต์ที่สัมพันธ์กับเซสชันปัจจุบัน) ดังนั้นฉัน วิ่งecho $SSH_AGENT_PIDและecho $SSH_AUTH_SOCKแต่ทั้งคู่ก็ว่างเปล่า ฉันรู้ทันที: อาจเป็นไปได้ว่ากระบวนการไม่ได้หยุดทำงานเมื่อออกจากระบบเนื่องจากssh-agent -kพยายามอ่าน PID จากตัวแปรสภาพแวดล้อมที่ไม่ได้ตั้งค่า

ปัญหา

เนื่องจากssh-agentไม่ได้ถูกฆ่าตายในการออกจากระบบและนี้เพื่อตรวจสอบว่าเกิดขึ้นเพราะตัวแปรสภาพแวดล้อมที่จำเป็นไม่ได้ตั้งค่าก็สามารถสิ่งหนึ่งเท่านั้นเฉลี่ย: ใครก็ตามที่เรียกร้องssh-agentในการเข้าสู่ระบบอาจจะไม่ได้ทำมันในทางที่เหมาะสม (ซึ่งจะเป็นeval "$(ssh-agent -s)" ) ดังนั้นฉันคิดว่า: ดีปัญหาคืออะไร? ฉันจะค้นหาไฟล์การกำหนดค่าบริการหรือสคริปต์การเข้าสู่ระบบใด ๆ ที่ได้รับการดำเนินการเพื่อเริ่มตัวแทนและแก้ไขด้วยตนเอง! มันจะอยู่ที่ไหนในโลก?

สิ่งที่ฉันได้ลอง

เนื่องจากฉันสังเกตว่ามีการssh-agentวางไข่ทุกครั้งที่ฉันเรียกsource ~/.bashrcไฟล์นี้เป็นไฟล์แรกที่ฉันตรวจสอบ แต่ไม่มีอะไรที่อ้างอิงถึงสิ่งที่เกี่ยวข้องกับ SSH จากระยะไกล ฉันค้นหาโดยใช้viสตริงsshในไฟล์ต่อไปนี้ทั้งหมด แต่ไม่พบอะไรเลย :

~/.bashrc
~/.profile
/etc/bash.bashrc
/etc/profile
/etc/profile.d/ (every file in this folder)
/etc/environment

มีไฟล์เพิ่มเติมอีกบ้างที่สามารถมีส่วนร่วมในsource ~/.bashrc? ฉันไม่รู้จริงๆ

จากนั้นฉันค้นหาsystemdบริการที่เกี่ยวข้องแต่พบเฉพาะssh.serviceซึ่งก็คือWantedBy=multi-user.targetและดังนั้นจึงไม่ได้ทำงานในการเข้าสู่ระบบ (และดีที่เห็นได้ชัดเพราะนี่คือภูตเซิร์ฟเวอร์ SSH)

ฉันพยายามย้ายไฟล์ทุกไฟล์ใน/home/piโฟลเดอร์ของฉันไปยังโฟลเดอร์ชั่วคราวและออกจากระบบแล้วกลับเข้ามาอีกครั้ง แต่ssh-agentก็ยังกลับกลายเป็น

ในที่สุดฉันก็ยิงช็อตสุดท้ายที่ฉันมีอยู่ในห้อง: ฉันวิ่งfind / -name 'ssh-agent'ตามรูทซึ่งพิมพ์ได้เฉพาะ/usr/bin/ssh-agentไฟล์ปฏิบัติการดังนั้นฉันจึงสร้างไฟล์ปฏิบัติการปลอมซึ่งโดยพื้นฐานแล้วจะบันทึกคำสั่งหลักเท่านั้น :

#! /bin/bash
ps -o args= $PPID        > /home/pi/LOG
cat /proc/$PPID/cmdline >> /home/pi/LOG

ฉันเปลี่ยนชื่อของจริง/usr/bin/ssh-agentและแทนที่ด้วยของปลอมที่ตั้งค่าสิทธิ์ / ผู้ใช้ / กลุ่มที่ถูกต้องวิ่งsource ~/.bashrcอีกครั้งจากนั้นพิมพ์LOGไฟล์:

-bash
-bash

ไม่ใช่เงื่อนงำเดียวกับสิ่งที่เกิดขึ้น

รายละเอียดเพิ่มเติมบางส่วน

ฉันกำลังเพิ่มรายละเอียดเพิ่มเติมฉันไม่รู้ว่าพวกเขาจะมีประโยชน์หรือไม่ แต่คุณรู้ว่า ... ปลอดภัยกว่าขออภัย

  • .bashrcต่อไปนี้เป็นของฉัน

  • ฉันสร้างผู้ใช้ใหม่dummyโดยใช้ชื่อuseradd -m dummyและการเข้าสู่ระบบไม่ได้เริ่มเลยssh-agent (ฉันรู้สึกว่านี่อาจหมายถึงบางสิ่ง) diff /home/pi/.bashrc /home/dummy/.bashrcแสดงให้เห็นโดยทั่วไปไม่มีอะไร (เพียงความคิดเห็นที่ฉันทำ) diff /home/pi/.profile /home/dummy/.profileเหมือนกันสำหรับ

  • ซ็อกเก็ตตัวแทนถูกสร้างโดยไม่มีปัญหาแม้ว่าSSH_AUTH_SOCKจะไม่ได้ตั้งค่า:

    pi:~$ ls -lAh /tmp/ssh-vQRTAyj7DJry/
    total 0
    srw------- 1 pi pi 0 Jan 28 03:12 agent.1328
    

    ไม่แน่ใจว่าทำไม แต่จำนวนในชื่อไฟล์ซ็อกเก็ตมักจะเป็นหนึ่งเสมอก่อน PID ของssh-agentกระบวนการ

  • ตัวอย่างจากhtop:

     PID  USER  PRI  NI  VIRT   RES   SHR  S  Command
       1  root   20   0  5472  3900  2728  S  /sbin/init
    1329  pi     20   0  3696   224    16  S  └─ ssh-agent -s
    
  • ติดตั้งแพ็คเกจที่ตรงกันssh:

    pi:~$ apt list --installed | grep ssh
    libpam-chksshpwd/oldstable,now 1.1.8-3.1+deb8u2+rpi3 armhf [installed]
    libssh-gcrypt-4/oldstable,now 0.6.3-4+deb8u2 armhf [installed,automatic]
    libssh2-1/oldstable,now 1.4.3-4.1+deb8u1 armhf [installed,automatic]
    openssh-client/oldstable,now 1:6.7p1-5+deb8u4 armhf [installed,automatic]
    openssh-server/oldstable,now 1:6.7p1-5+deb8u4 armhf [installed,automatic]
    openssh-sftp-server/oldstable,now 1:6.7p1-5+deb8u4 armhf [installed,automatic]
    ssh/oldstable,now 1:6.7p1-5+deb8u4 all [installed]
    sshpass/oldstable,now 1.05-1 armhf [installed]
    
  • กำลังหาssh-agent -sซ้ำใช้grepใน/etcและ/libอัตราผลตอบแทนไม่มีผลลัพธ์

  • ฉันไม่ได้ติดตั้งสภาพแวดล้อมเดสก์ทอป แต่มี/etc/X11โฟลเดอร์ที่มีไฟล์การกำหนดค่าอยู่ ฉันพยายามเปลี่ยนชื่อโฟลเดอร์เป็นอย่างอื่นและรีบูตเครื่องในกรณีที่ แต่กระบวนการยังคงได้รับกลับกลายดังนั้นดูเหมือนจะไม่เกี่ยวข้องกับสิ่งนี้มากนัก


ข้อสรุป

ตอนนี้เพื่อให้ง่ายที่สุดฉันมีเพียงสองคำถาม:

  1. สิ่งนี้ssh-agentเกิดที่ไหนและอย่างไรใครเป็นผู้ออกคำสั่ง?
  2. ทำไมมันไม่ถูกเรียกในวิธีที่เหมาะสมโดยไม่ต้องตั้งค่าตัวแปรสภาพแวดล้อมที่จำเป็นดังนั้นจึงปล่อยให้กระบวนการหยุดทำงานที่นั่นอย่างไม่มีกำหนด?

ฉันสงสัยว่าคุณมีอะไรใน~/.bashrcตอนนั้น
ilkkachu

@ilkkachu งั้นคุณไป ...
Marco Bonelli

คำตอบ:


1

ฉันรู้สาเหตุที่เป็นไปได้สองอย่าง:

  • หากคุณกำลังใช้libpam-sshงานมันสามารถเริ่มต้นเอเจนต์ SSH ให้คุณโดยอัตโนมัติโดยเป็นส่วนหนึ่งของการเริ่มต้นเซสชันและแม้กระทั่งการโหลดกุญแจของคุณโดยอัตโนมัติหากพวกเขาไม่มีข้อความรหัสผ่านหรือวลีรหัสผ่านก็เหมือนกับรหัสผ่านเข้าสู่ระบบของคุณ

  • หากคุณกำลังใช้gpg-agentงานก็สามารถเลือกปฏิบัติภารกิจได้ssh-agentเช่นกัน การปิดระบบถูกจัดการแตกต่างกันดังนั้นจะมีเพียงSSH_AUTH_SOCKตัวแปรสภาพแวดล้อมเท่านั้นไม่ใช่SSH_AGENT_PID

  • หากคุณมี SSH-agent (เช่น PuTTY's Pageant) ทำงานบนเวิร์กสเตชันของคุณและทำการเชื่อมต่อ SSH ด้วยการเปิดใช้งานการส่งต่อตัวแทน (และระยะไกลsshdอนุญาตให้) บนโฮสต์ระยะไกลคุณจะเห็นอีกครั้งSSH_AUTH_SOCKโดยไม่ต้องSSH_AGENT_PID... เพราะซ็อกเก็ตตัวแทน ไปที่ช่องสัญญาณsshdใดกลับไปที่เอเจนต์ SSH ของเวิร์กสเตชันของคุณ


1
ขอบคุณสำหรับคำแนะนำ แต่น่าเสียดายที่ไม่มีตัวเลือกเหล่านี้ที่เหมาะกับฉัน ฉันไม่ได้มีlibpam-ssh; ทั้งสองSSH_AGENT_PIDและSSH_AUTH_SOCKไม่ได้ตั้งค่า (ซ็อกเก็ตแน่นอนปัจจุบันอยู่แล้ว); ฉันไม่ได้ใช้gpg-agentและไม่มีการเปิดใช้ตัวแทนการส่งต่อใน PuTTY ฉันแพ้จริงๆ: \
Marco Bonelli
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.