วัตถุประสงค์ของ ssh-agent คืออะไร?


70

ฉันอ่านคำจำกัดความอย่างเป็นทางการแล้ว:

ssh-agent เป็นโปรแกรมที่จะเก็บกุญแจส่วนตัวที่ใช้สำหรับการตรวจสอบกุญแจสาธารณะ (RSA, DSA, ECDSA) แนวคิดคือ ssh-agent เริ่มต้นขึ้นในตอนต้นของเซสชัน X หรือเซสชันล็อกอินและหน้าต่างหรือโปรแกรมอื่น ๆ ทั้งหมดเริ่มต้นเป็นไคลเอนต์ไปยังโปรแกรม ssh-agent ผ่านการใช้ตัวแปรสภาพแวดล้อมเอเจนต์สามารถหาตำแหน่งและใช้สำหรับการพิสูจน์ตัวตนโดยอัตโนมัติเมื่อล็อกอินเข้าสู่เครื่องอื่นโดยใช้ ssh (1)

"..a โปรแกรมเพื่อเก็บคีย์ส่วนตัว .. " - IMHO - คีย์ ssh ถูกสร้างขึ้นโดยผู้ใช้ที่มีคำสั่ง ssh-keygen และเพียง & ตรงไปตรงมาเก็บไว้ใน ~ / .ssh - ทำไมฉันต้อง daemon บางอย่างเพื่อเก็บกุญแจเหล่านี้? มันมีวิธีการจับพวกเขาอย่างไร - พวกเขาไม่เพียงแค่เก็บไว้ใน. ssh?

"เริ่มต้นจากไคลเอนต์ไปยังโปรแกรม ssh-agent" - ฉันไม่เข้าใจ จะต้องใช้ที่ไหน ฉันมักจะใช้ ssh เช่นนี้:

 ssh -i ~/.ssh/private_key_name username@hostname

"ลูกค้า" ด้วยตนเองหมายถึงอะไร - ลูกค้าอะไร? คุณไม่เพียงแค่รันคำสั่ง ssh จากเทอร์มินัลเพื่อเชื่อมต่อ - ไคลเอนต์อื่น ๆ ที่อยู่ที่นั่นและทำไมพวกเขาไม่สามารถใช้พา ธ ไปยังไฟล์ส่วนตัว ssh นั้นได้เช่นเดียวกับคำสั่ง ssh?

คำตอบ:


75

ตัวแทน SSH จัดการการลงนามของข้อมูลการตรวจสอบสำหรับคุณ เมื่อตรวจสอบสิทธิ์ไปยังเซิร์ฟเวอร์คุณจะต้องลงชื่อข้อมูลบางอย่างโดยใช้รหัสส่วนตัวของคุณเพื่อพิสูจน์ว่าคุณเป็นคุณ

เป็นมาตรการรักษาความปลอดภัยคนส่วนใหญ่จะปกป้องคีย์ส่วนตัวด้วยข้อความรหัสผ่านอย่างสมเหตุสมผลดังนั้นความพยายามในการตรวจสอบสิทธิ์ใด ๆ จะทำให้คุณต้องป้อนข้อความรหัสผ่านนี้ สิ่งนี้อาจไม่เป็นที่พึงปรารถนาดังนั้น ssh-agent จะเก็บคีย์สำหรับคุณและคุณจะต้องป้อนรหัสผ่านเพียงครั้งเดียวเมื่อตัวแทนต้องการถอดรหัสมัน (และบ่อยครั้งที่ไม่ได้เป็นเช่นนั้นเพราะ ssh-agent สามารถรวมกับ pam ได้ ซึ่งสิ่งที่ distros ทำ)

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

ข้อดีอีกอย่างของตัวแทน SSH คือสามารถส่งต่อผ่าน SSH ได้ ดังนั้นเมื่อคุณ ssh ไปยังโฮสต์ A ในขณะที่ส่งต่อเอเจนต์ของคุณคุณสามารถ ssh จาก A ไปยังโฮสต์ B อื่นโดยไม่จำเป็นต้องมีคีย์ของคุณอยู่ (ไม่ใช่แม้แต่ในรูปแบบเข้ารหัส) บนโฮสต์ A


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

3
@ แพทริคซึ่งอาจเป็นข้อเสีย - ลองใช้คีย์ที่ไม่ถูกต้องมากเกินไปบนเซิร์ฟเวอร์และจะปิดการเชื่อมต่อก่อนที่คุณจะได้คีย์ที่ถูกต้อง แน่นอนว่าเป็นสิ่งที่~/.ssh/config's IdentityFileเป็นตัวเลือกที่ดีสำหรับการมีหรือไม่มีตัวแทน
โทเบียส KIENZLER

@ แพทริกที่ดูเหมือนเป็นไปได้อย่างเท่าเทียมกันโดยไม่มีตัวแทน
Andrey Fedorov

@AndreyFedorov ใช่คุณสามารถมีหลายคีย์ได้โดยไม่ต้องมีตัวแทน แต่คุณสามารถระบุได้ว่า~/.ssh/configจะใช้คีย์ใดในรีโมตโฮสต์เพื่อให้ทราบว่าต้องการคีย์ใด
Patrick

3
ดังนั้นเราจึงสามารถสันนิษฐานได้ว่าssh-agentไม่จำเป็นถ้ารหัสส่วนตัวไม่ได้รับการป้องกันด้วยข้อความรหัสผ่าน?
pkaramol

16

ประโยชน์ที่จะได้รับssh-agentคือคุณจะต้องป้อนข้อความรหัสผ่านของคุณเพียงครั้งเดียว หากคีย์ RSA ส่วนตัวของคุณไม่ได้เข้ารหัสด้วยวลีรหัสผ่านคุณไม่จำเป็นต้องใช้ ssh-agent sshคำสั่งจะเป็นตัวอย่างของลูกค้าที่ใช้งาน


7

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

ประโยชน์เพิ่มเติมคือว่าตามmanหน้าเพจตัวแทนไม่เคยส่งคีย์ส่วนตัวผ่านช่องทางร้องขอ; ดังนั้นหากคุณกำลังกระโดดระหว่างกล่องต่าง ๆ กุญแจส่วนตัวของคุณจะได้รับการปกป้อง

1คุณสามารถกำหนดlifeเวลาที่จะเก็บกุญแจไว้ในตัวแทน


6

บทความ Wikipediaอาจมีคำอธิบายที่ดีที่สุด:

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

คำต่อคำอีกครั้งจากบทความวิกิพีเดีย:

... ssh-agent สร้างซ็อกเก็ตแล้วตรวจสอบการเชื่อมต่อจาก ssh ทุกคนที่สามารถเชื่อมต่อกับซ็อกเก็ตนี้ยังมีการเข้าถึง ssh-agent การอนุญาตถูกตั้งค่าเหมือนในระบบ Linux หรือ Unix ปกติ เมื่อเอเจนต์เริ่มต้นมันจะสร้างไดเรกทอรีใหม่ใน / tmp ด้วยสิทธิ์ที่ จำกัด ซ็อกเก็ตตั้งอยู่ในโฟลเดอร์

โดยทั่วไปจะใส่ไว้ในระบบหรือไฟล์ rc ของผู้ใช้เช่น$HOME/.bashrcหรือ$HOME/.profile(สำหรับ bash shells) เพื่อให้ตัวแปรสภาพแวดล้อมssh-agentตั้งค่าถูกรวมเข้ากับสภาพแวดล้อมของคุณได้อย่างสมบูรณ์

ในระบบ Fedora 14 ของฉันมันเริ่มต้นค่อนข้างเร็วเนื่องจากเป็นส่วนหนึ่งของระบบย่อย X11 ในไฟล์นี้/etc/X11/xinit/xinitrc-common:

# Prefix launch of session with ssh-agent if available and not already running.
SSH_AGENT=
if [ -z "$SSH_AGENT_PID" ] && [ -x /usr/bin/ssh-agent ]; then
    if [ "x$TMPDIR" != "x" ]; then
        SSH_AGENT="/usr/bin/ssh-agent /bin/env TMPDIR=$TMPDIR"
    else
        SSH_AGENT="/usr/bin/ssh-agent"
  fi
fi

ตัวแปร$SSH_AGENTจะถูกใช้ในสคริปต์เริ่มต้น X11 อื่น ๆ เช่นที่นี่/etc/X11/xinit/Xclients:

exec -l $SHELL -c "$SSH_AGENT $XCLIENTS_D/Xclients.$1.sh"

โดยการรวมเข้ากับที่นี่ตัวแปรสภาพแวดล้อมต่อไปนี้ได้รับการตั้งค่าเป็นส่วนหนึ่งของพาเรนต์เชลล์ดังนั้นเด็กที่แยกทั้งหมดควรมีเช่นกัน:

SSH_AUTH_SOCK=/tmp/ssh-PspRF18958/agent.18958; export SSH_AUTH_SOCK;
SSH_AGENT_PID=18959; export SSH_AGENT_PID;

มีความซับซ้อนมากกว่านี้เล็กน้อย แต่โดยสรุปนี่เป็นสิ่งที่เกิดขึ้นโดยssh-agentทั่วไป

ตัวอย่างเช่นใน GNOME ssh-agentมีการเปิดตัวจริงต่อผู้ใช้หนึ่งรายเป็นแอปพลิเคชันเริ่มต้น:

                     ss ของแอพเริ่มต้น

TL; DR

บรรทัดล่างssh-agentมีอยู่เพื่อให้เมื่อคุณต้องการคีย์ ssh คุณต้องปลดล็อคพวกเขาเพียงครั้งเดียวด้วยข้อความรหัสผ่านของพวกเขา (สมมติว่าพวกเขามีหนึ่ง) และจากนั้นพวกเขาก็มีอยู่ในรูปแบบถอดรหัสในหน่วยความจำ (RAM)


1

"เริ่มต้นจากไคลเอนต์ไปยังโปรแกรม ssh-agent" หมายถึงแนวคิดที่เริ่มต้น ssh-agent ในระหว่างการเริ่มต้นการเข้าสู่ระบบเซสชัน (ภายใน) เพื่อให้โปรแกรมทั้งหมดได้รับตัวแปรสภาพแวดล้อม$SSH_AGENT_PIDและ$SSH_AUTH_SOCKสิ่งที่จำเป็นสำหรับการเชื่อมต่อตัวแทน

ข้อดีอีกประการของการจัดการไพรเวตคีย์จาก ssh คือ ssh-agent สามารถถูกแทนที่ด้วย gpg-agent ดังนั้นคุณสามารถใช้คีย์ OpenPGP (พร้อมความสามารถในการตรวจสอบความถูกต้อง) สำหรับ SSH นั่นเป็นทางออกที่ดีสำหรับปุ่ม OpenPGP บนสมาร์ทการ์ด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.