วิธีการขอรหัสผ่านกุญแจ SSH ครั้งเดียวและเมื่อจำเป็นเท่านั้น?


15

(ฉันได้อ่านคำถามมากมายในเว็บไซต์นี้ที่มีลักษณะเกี่ยวข้องและฉันเชื่อว่านี่เป็นคำถามใหม่อย่างแท้จริง)

ฉันมีกุญแจจำนวนมากในเซิร์ฟเวอร์จำนวนมากและพวกเขาทั้งหมดได้รับการป้องกันด้วยวลีรหัสผ่าน

ฉันชอบป้อนวลีรหัสผ่านประมาณเท่าที่ฉันต้องการป้อนรหัสผ่านซึ่งเป็นประสิทธิภาพการทำงานที่แท้จริง

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

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

ปัญหาที่ฉันมีคือทั้งสองโซลูชั่นเหล่านี้มักจะเริ่มต้นในการเข้าสู่ระบบเชลล์ (เช่น.zshrc) พึ่งพาฉันป้อนข้อความรหัสผ่านของฉันเมื่อฉันเข้าสู่ระบบแม้ว่าฉันจะไม่ต้องการปลดล็อค (ฉันไม่มีความสุขกับพวงกุญแจที่ทำให้ตัวแทนมีชีวิตอยู่อย่างไม่มีกำหนด)

สิ่งที่ฉันต้องการคือการถามรหัสผ่าน (สำหรับตัวแทน) เมื่อจำเป็นเท่านั้น

ดังนั้นฉันสามารถเข้าสู่เซิร์ฟเวอร์ A ทำบางสิ่งจากนั้น ssh ไปยังเซิร์ฟเวอร์ B และณ จุดนั้นขอรหัสผ่าน ทำสิ่งต่าง ๆ บนเซิร์ฟเวอร์ B ออกจากระบบ กลับไปที่ A ทำอะไรเพิ่มอีก ssh ไปที่ B อีกครั้งและไม่ต้องการข้อความรหัสผ่านของฉัน (มันเป็นตัวแทนโดย)

ฉันทราบว่าสิ่งนี้เป็นไปได้บนเดสก์ท็อปแบบกราฟิกเช่น Gnome คุณจะได้รับป๊อปอัพเพื่อขอข้อความรหัสผ่านเพื่อปลดล็อคกุญแจส่วนตัวของคุณทันทีที่คุณลองใช้ ssh ดังนั้นนี่คือสิ่งที่ฉันเป็น แต่มาจากคอนโซล


ทำไมไม่สร้างแค่ ssh-keys โดยไม่มีข้อความรหัสผ่าน? หากคุณกำลังจะผ่านปัญหาทั้งหมดนี้หรือไม่?
devnull

1
หากมีคนพักและมีรหัสผ่านน้อยกว่าคีย์ (หรือเอเจนต์ ssh ที่ใช้งานอยู่) พวกเขาสามารถเข้าถึงเซิร์ฟเวอร์อื่น ๆ ได้เช่นกัน นอกจากนี้ยังสามารถขโมยและใช้คีย์รหัสผ่านที่ไม่มีวลีได้ในที่อื่น
artfulrobot

เท่าที่ฉันรู้ไม่มีทางทำสิ่งที่คุณต้องการโดยไม่ต้องเสียสละระดับความปลอดภัยซึ่งดูเหมือนว่าคุณไม่ต้องการทำ มีคำตอบในเชิงลึกโดยโทมัส Nyman ที่นี่ที่จะเข้าสู่ความเป็นไปได้มากที่สุดถ้าคุณยังไม่ได้อ่านมันคือ: unix.stackexchange.com/a/90869/82289 ฉันได้รับสิ่งนี้ที่ บริษัท ของฉันโดยใช้เซิร์ฟเวอร์ระดับกลางที่จัดการเซสชัน ssh กับ Tmux
devnull

@DevNull ดูเหมือนว่าแปลกที่คุณสามารถทำได้ด้วยเดสก์ท็อป แต่ไม่ได้มี terminal ใช่มั้ย แน่นอนว่ามันต้องการตัวแทนเพื่อข้ามไปยัง tty หากไม่มีการเพิ่มกุญแจ? นี่ต้องเป็นวิธีที่คน GUI ทำงานหรือไม่
artfulrobot

คุณอาจดูคำตอบของฉันที่นี่: unix.stackexchange.com/a/184160/89706 (ลิงก์คำถาม: unix.stackexchange.com/questions/90853/… )
จอห์นนี่หว่อง

คำตอบ:


16

อย่าเพิ่มอะไรลงในสคริปต์เริ่มต้นเชลล์ของคุณนี่เป็นแฮกเกอร์ที่ไม่จำเป็น

ให้เพิ่ม

AddKeysToAgent yes

เพื่อ. ssh / config

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


ฉันหวังว่าผู้คนจะแสดงความคิดเห็นเมื่อลงคะแนน ถ้ามันไม่ถูกต้องเป็นสิ่งสำคัญเรารู้ว่าทำไมมันไม่ถูกต้อง ขอบคุณที่โพสต์ฉันไม่มีเวลาลองข้อเสนอแนะของคุณเอง
artfulrobot

ฉันสงสัยด้วยเช่นกันอาจเป็นเพราะการโพสต์ข้ามของฉัน
Toby

มันใช้งานได้สำหรับฉัน อย่างไรก็ตามมันเป็นส่วนเสริมล่าสุดของ openssh (7.2) ในกรณีที่ช่วยใครได้ openssh 7.3 มีให้ใน Debian Sid
artfulrobot

@artfulrobot: แปลกเพราะฉันมีพฤติกรรมเดียวกันนี้ (auto-ssh-add ที่การเรียกครั้งแรกของ ssh) ทำงานมานานหลายปีจนกระทั่งในที่สุดก็หยุดบางเวลาที่ผ่านมา ค้นหาสาเหตุฉันพบ AddKeysToAgent และคิดว่าสาเหตุที่หยุดคือโดยบังเอิญฉันต้องกำจัด. ssh / config และ AddKeysToAgent ของฉันพร้อมด้วย ตอนนี้ฉันสงสัยว่าทำไมมันใช้งานได้นานก่อนที่จะเปิดตัว OpenSSH 7.2 ฉันไม่ได้จินตนาการถึงสิ่งนี้ :-)
Toby

@Toby นี่คือสิ่งที่ฉันต้องการ น่าเสียดายที่ ssh-agent ดูเหมือนจะไม่เริ่มทำงานโดยอัตโนมัติใน kubuntu ดังนั้นนั่นคือสิ่งต่อไปที่ฉันต้องแก้ไข
Ogaday

7

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

ด้วยวิธีนี้พวงกุญแจจะทำงานก่อนคำสั่ง ssh เท่านั้นและถ้าจำเป็นเท่านั้น

ใส่สิ่งนี้ใน~/.zshrc:

function check_ssh {
  [[ $3 =~ '\bssh\b' ]] || return
  [[ -n "$SSH_AGENT_PID" && -e "/proc/$SSH_AGENT_PID" ]] \
    && ssh-add -l >/dev/null && return
  eval `keychain --eval id_dsa --timeout 60`
}    
autoload -U add-zsh-hook
add-zsh-hook preexec check_ssh

สิ่งที่เกิดขึ้นที่นี่คือเมื่อใดก็ตามที่คำสั่งถูกพิมพ์check_sshจะถูกเรียกก่อนที่คำสั่งจะถูกดำเนินการ

บรรทัดแรกของฟังก์ชั่นตรวจสอบคำสั่งที่ขยายสำหรับการsshใช้ Zsh regex sshจะต้องมีขอบเขตของคำ\bทั้งสองข้าง หากไม่พบสิ่งนี้ฟังก์ชันจะส่งคืน

บรรทัดถัดไปตรวจสอบว่ามีกระบวนการเอเจนต์ SSH ในตัวแปรสภาพแวดล้อมและกระบวนการนั้นมีอยู่ในตารางกระบวนการแล้วจากนั้นเพิ่มอย่างน้อยหนึ่งคีย์ในเอเจนต์ หากทั้งหมดนั่นคือตกลงเอเจนต์ ssh จะถูกตั้งค่าและเราไม่จำเป็นต้องทำอะไรเลยดังนั้นมันจึงส่งคืน

ในที่สุดเราก็เริ่มพวงกุญแจกับตัวแทนที่จะรักษาชีวิตเป็นเวลาหนึ่งชั่วโมง

มันยังคงทิ้งปัญหาเกี่ยวกับสิ่ง SSH ฝังตัวเช่นgitหรือrsyncหรือscpว่าจะไม่เรียกฟังก์ชั่น (คุณสามารถเพิ่มเหล่านี้เพื่อ regex ไม่)


แม้จะไม่มีzshใครก็สามารถสร้างสคริปต์สั้น ๆ ที่มีเอฟเฟกต์แบบเดียวกันและวางไว้PATHตรงหน้าsshไคลเอ็นต์จริง อาจทำงานร่วมกับrsyncet al หากพวกเขาอ่านPATHแทนที่จะทำงาน/usr/bin/sshโดยตรง
ilkkachu

2

สำหรับ zsh ฉันได้เขียนชุดโปรแกรมอรรถประโยชน์และชุดคำสั่งเพื่อทำสิ่งที่คุณต้องการมากขึ้นหรือน้อยลง: https://www.vinc17.net/unix/index.en.html#zsh-ssh-utils

ที่จริงแล้วสิ่งนี้ทำอะไรได้มากกว่านี้เพราะssh-agentจะมีการแชร์เซสชันการเข้าสู่ระบบทั้งหมด (เดสก์ท็อปหรือผ่าน SSH และหน้าจอ GNU ก็รองรับเช่นกันถ้าคุณเริ่มเชลล์การล็อกอินจากเช่นshell -zshใน~/.screenrcไฟล์) และจะเลิกหลังจาก เซสชันล่าสุดสิ้นสุดลง

หมายเหตุ: ฉันใช้ข้อความรหัสผ่านเดียวสำหรับคีย์ทั้งหมดของฉัน ฉันไม่แน่ใจเกี่ยวกับพฤติกรรมของข้อความรหัสผ่านที่แตกต่างกัน อาจจำเป็นต้องมีการเปลี่ยนแปลงบางอย่าง


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