แคชรหัสผ่านถ้าห้ามใช้ SSH-keys


46

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

ตอนนี้; ฉันไม่สามารถเปลี่ยนความคิดของพวกเขา (ฉันพยายาม)

มีวิธีในการเก็บรหัสผ่าน SSH ชั่วคราวอย่างน้อยวิธีที่ GIT สามารถเก็บรหัสผ่านไว้ในแคชตามเวลาที่กำหนดได้หรือไม่?


55
the computing center explicitly forbids SSH-keys because they are "insecure"- ความเห็นของฉันในเรื่องนี้? ค้นหาโฮสต์เซิร์ฟเวอร์ใหม่เนื่องจากคุณไม่ได้ใช้งานอย่างชัดเจน
Matt Clark

18
@ Matt: "ศูนย์คำนวณ" ฟังดูเหมือนระบบกริดทางวิชาการซึ่งไม่ได้มีการแข่งขันมากนักฉันเดาว่า
grawity

27
พวกเขาผิด พวกเขาอาจลืมปิดใช้งานคีย์ ssh เมื่อหมดอายุบัญชีดังนั้นพวกเขาจึงตัดสินใจว่าคีย์ ssh เป็นปัญหา
Joshua

10
grawity ถูกต้อง มันเป็นซูเปอร์คอมพิวเตอร์ระดับประเทศดังนั้นฉันจึงติดอยู่กับมัน สำหรับสิ่งที่คุ้มค่าเครื่องดี Joshua อาจจะถูกเช่นกัน แต่ก็ใช่ว่าจะเป็นสิ่งที่ไม่ถูกต้องสำหรับผู้ใช้
2667180

7
@TheHansinator หากมีการติดตั้ง keylogger คุณได้รับการโจมตีจนถึงจุดที่มันไม่สำคัญว่าคุณจะปกป้องการเชื่อมต่อ ssh ของคุณ แต่มีข้อดีอื่น ๆ ของการpublickeyตรวจสอบ หากคุณปิดใช้งานการpasswordรับรองความถูกต้องบนเซิร์ฟเวอร์คุณจะป้องกันผู้โจมตีเหล่านั้นทั้งหมดที่พยายามเดารหัสผ่าน และหากผู้โจมตีพยายามโจมตี mitm กับไคลเอนต์ที่ไม่ได้เก็บรหัสสาธารณะของเซิร์ฟเวอร์ไว้ก่อนหน้านี้คุณจะได้รับการปกป้องที่ดีขึ้นกว่าการpublickeyใช้การpasswordพิสูจน์ตัวตน
kasperd

คำตอบ:


63

การเชื่อมต่อใช้ซ้ำ

SSHv2 อนุญาตให้การเชื่อมต่อที่ผ่านการรับรองความถูกต้องเดียวกันสามารถสร้าง 'แชนเนล' หลายอัน - เชลล์แบบโต้ตอบ, คำสั่งแบตช์, SFTP พร้อมกับอันที่สองเช่นการส่งต่อตัวแทนหรือการส่งต่อ TCP เซิร์ฟเวอร์ของคุณอาจรองรับการเชื่อมต่อมัลติเพล็กซิ่งตามค่าเริ่มต้น (หากผู้ดูแลระบบของคุณบ่นก็ไม่ได้แคชรหัสผ่านของคุณที่ใดก็ได้ - มันแคชการเชื่อมต่อทั้งหมด)

ด้วย OpenSSH คุณมีControlMasterและControlPathตัวเลือก (-M และ -S) เพื่อใช้ประโยชน์จากสิ่งนี้:

  1. เริ่มต้น 'ต้นแบบ' SSH -Mเชื่อมต่อโดยใช้ (เนื่องจากคุณยังไม่มี ControlPath ในการตั้งค่าของคุณคุณต้องระบุไว้ใน command line โดยใช้-Sมันต้องใช้เวลานานดังนั้นฉันจึงเพิ่ม-fNตัวเลือกในการดร็อปแบ็คกราวนด์

    $ ssh foo@bar.example.com -fNMS ~/.ssh/bar.socket
    foo@bar.example.com's password:
    

    คุณกลับไปที่โลคอลเชลล์

  2. เริ่มการเชื่อมต่อใหม่ผ่านทางมาสเตอร์:

    $ ssh foo@bar.example.com -S ~/.ssh/bar.socket
    

    คุณอยู่ใน.

  3. ในการทำให้สิ่งนี้มีประโยชน์สำหรับ Git / rsync / SFTP คุณต้องตั้งค่าControlPathในการกำหนดค่าของคุณเพราะคุณจะไม่สามารถระบุได้-Sตลอดเวลา:

    Host *
        ControlPath ~/.ssh/S.%r@%h:%p
    

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

  1. การกำหนดค่าใน~/.ssh/config:

    Host *
        ControlPath ~/.ssh/S.%r@%h:%p
        ControlMaster auto
        ControlPersist 15m
    
  2. การเชื่อมต่อครั้งแรกขอรหัสผ่าน:

    $ ssh foo@bar.example.com
    foo@bar.example.com's password:
    [foo@bar:~]$ exit
    
  3. ที่สองไม่ได้:

    $ ssh foo@bar.example.com
    [foo@bar:~]$ yay
    

ในการควบคุมมัลติเพล็กซ์มาสเตอร์ (หยุดหรือกำหนดค่าการส่งต่อ TCP) ให้ใช้-Oตัวเลือก

วิธีการที่คล้ายกันคือการสนับสนุนจากรุ่นฉาบล่าสุด


1
ขอบคุณมากสำหรับคำตอบที่ดีนี้ google ไม่มีประโยชน์กับปัญหานี้เนื่องจากมันเปลี่ยนเป็น ssh-keys เสมอและฉันไม่ทราบคำหลักที่ถูกต้อง ช่วยฉันมาก!
2667180

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

3
@shellster: คุณหมายถึง "ใครก็ตามที่มี UID เดียวกัน" เช่นเดียวกับกรณีที่มี ssh-agent อยู่แล้ว แม้ว่าคุณจงใจเปิดสิทธิ์ของไฟล์ซ็อกเก็ต (ซึ่งเป็นค่าเริ่มต้นคือ 0600) ผู้ใช้รายอื่นก็จะได้รับ "multiplex uid mismatch" ออกมาจากมัน
grawity

3
@shellster คนที่มีรูทสามารถติดตั้ง keylogger และขโมยรหัสผ่านของคุณไปยังระบบระยะไกลได้หรือทำสิ่งที่เลวร้ายหลายอย่าง หากเรากังวลเกี่ยวกับรูทของเครื่องนี่จะไม่ปลอดภัยกว่าการบันทึกคีย์ส่วนตัว SSH
amalloy

1
ฉันไม่คิดว่าภัยคุกคามจากรากท้องถิ่นจะเกิดขึ้นถ้าหากมันกลายเป็นภัยคุกคาม (เช่นเดียวกับการสอดแนมระดับรัฐบาล) ตรงไปตรงมารูทท้องถิ่นสามารถแทนที่ไคลเอ็นต์ssh และเอเจนต์ ssh ของคุณด้วยสิ่งที่พวกเขาต้องการ เก็บรหัสผ่านและกุญแจส่วนตัวทั้งหมดใน /root/.secret หรือไม่ แน่ใจ
grawity

19

ใช้ sshpass

sshpass ( github , man page ) เป็นเครื่องมือที่ป้อนรหัสผ่านให้ ssh โดยอัตโนมัติ วิธีใช้ที่ปลอดภัยคือ:

% echo 'correct horse battery staple' > ~/.ssh/compute_password
% chmod go-rw ~/.ssh/compute_password

% sshpass -f ~/.ssh/compute_password ssh foo@host

นี่จะอ่านรหัสผ่าน~/.ssh/compute_passwordซึ่งคล้ายกับไฟล์กุญแจส่วนตัวโดยไม่มีข้อความรหัสผ่าน คุณสามารถวางsshpassคำสั่งในเชลล์สคริปต์ขนาดเล็กหรือเชลล์นามแฝงเพื่อหลีกเลี่ยงการพิมพ์คำสั่งแบบเต็ม ~/.ssh/configน่าเศร้าที่ฉันไม่ได้พบวิธีการทำเช่นนี้จาก

(นอกจากนี้ยังสามารถระบุรหัสผ่านได้โดยตรงบนบรรทัดคำสั่งsshpassด้วย แต่ควรหลีกเลี่ยงเพราะจะทำให้รหัสผ่านรั่วไหลไปยังผู้ที่สามารถทำได้ps)

เปรียบเทียบกับวิธีอื่น

แน่นอนว่าวิธีการนี้มีความปลอดภัยน้อยกว่าการตั้งค่าการรับรองความถูกต้องของรหัสสาธารณะ แต่คุณอาจรู้อยู่แล้ว

มันมีความปลอดภัยน้อยกว่าคำตอบของ @ grawity เกี่ยวกับการใช้การเชื่อมต่อซ้ำ แต่ก็มีข้อได้เปรียบที่ไม่ต้องป้อนรหัสผ่านแบบโต้ตอบเลย

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


3
หากนโยบายของศูนย์คำนวณคำนวณจาก "แต่คู่คีย์จะเก็บไว้ในดิสก์ที่มีคนขโมยได้!" ดูเหมือนว่านโยบายนั้นจะค่อนข้างย้อนกลับ
grawity

6
@grawity ดีนโยบายที่ไม่ดีนำไปสู่การทำงานที่เลวร้ายยิ่งขึ้น¯ \ _ (ツ) _ / ¯
marcelm

1
หากคุณสร้างรหัสผ่านของคุณเป็นตัวอักษรแบบสุ่มที่ยาวพอสมควร (พูดhead -c 16 /dev/urandom | base64ถึง 128 บิต) และไม่ใช้รหัสผ่านในระบบอื่น ๆ รหัสความปลอดภัยก็คล้ายกับกุญแจ ยากที่จะดุร้ายและง่ายต่อการใช้งานจากไฟล์หากไม่มีการเข้ารหัส สิ่งนี้จะไปสำหรับคนเลวด้วยเช่นกันหากพวกเขาได้รับไฟล์ ความแตกต่างเพียงอย่างเดียวคือรหัสผ่านจะถูกส่งไปยังเซิร์ฟเวอร์ตามที่เป็นอยู่ในขณะที่ปุ่มมีเลขคณิตศาสตร์ที่ดีกว่าเพื่อพิสูจน์ว่าคุณเป็นเจ้าของคีย์ส่วนตัวที่ถูกต้องโดยไม่เปิดเผยและการใช้งานง่ายมันยากที่จะเข้ารหัสไฟล์ เครื่องมือมาตรฐาน)
ilkkachu

1

ใช้เครื่องมือจัดการรหัสผ่าน

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

ไม่จำเป็นต้องคัดลอกจำอะไรก็ได้ (ยกเว้นรหัสผ่านเพื่อปลดล็อกฐานข้อมูล) และคุณสามารถใช้รหัสผ่านที่คาดเดาได้โดยไม่ต้องทำการแมป 30 ตัวอักษรทุกครั้งที่คุณพยายามลงชื่อเข้าใช้

คุณสามารถเลือกรายการโปรดของคุณจากรายการนี้: https://en.wikipedia.org/wiki/List_of_password_managers


3
ฉันไม่แน่ใจว่าคุณสมบัติการพิมพ์อัตโนมัติทำงานได้ดีกับโปรแกรมที่ใช้เทอร์มินัลหรือไม่ การตรวจจับจะมองหาชื่อหน้าต่างที่เฉพาะเจาะจงและ autotyping เองนั้นไม่มีคุณสมบัติ "anti-keylogging" ที่แฟนซีซึ่ง KeePass2 มี ...
grawity

1
@grawity gnome-terminalเปลี่ยนชื่อเป็นssh somehostเมื่อ ssh ถามรหัสผ่านเพื่อให้คุณสามารถจับคู่หน้าต่างชื่อกับสิ่งนี้โดยไม่มีปัญหา ฉันไม่รู้อะไรเลยเกี่ยวกับคุณสมบัติ 'anti-keylogging' - ฉันใช้ KeePassXC ในเทอร์มินัลทุกวันและสิ่งที่แย่ที่สุดที่ฉันต้องทำคือเลือกบัญชีที่เหมาะสมจากรายการ
โฟมบินได้

2
@grawity จำเป็นต้องเปิดใช้งานคุณลักษณะการป้องกันการล็อกคีย์บนพื้นฐานต่อรายการ (สำหรับเหตุผลที่โปรแกรมหลายโปรแกรมไม่สนับสนุนการวาง)
บ๊อบ

0

อีกทางเลือกหนึ่งคือการใช้ไคลเอนต์ GUI ssh บน Windows ตัวเลือกที่ชัดเจนจะฉาบ นอกจากนี้ยังมี PuTTY รุ่นลีนุกซ์โดยเฉพาะอย่างยิ่ง Distros ที่ใช้ Debian ส่วนใหญ่เช่น Ubuntu โดยทั่วไปจะรวม PuTTY ไว้ใน repo

อีกประการหนึ่งของลูกค้าที่ดีจริงๆคือTermius ไม่เพียงรองรับ Windows และ Linux เท่านั้น แต่ยังรองรับ OSX, iOS และ Android แม้ว่ามันจะถูกออกแบบมาสำหรับโทรศัพท์รุ่นเดสก์ท็อปเป็นจริงค่อนข้างดี

ถ้าฉันไม่เข้าใจผิด Hyperterminal ที่เคารพใน Windows ก็มี / มีไคลเอ็นต์ ssh อยู่ภายใน แต่ฉันไม่ได้ใช้ windows ในเวลานานมากดังนั้นฉันจึงไม่แน่ใจทั้งหมด

ไคลเอนต์ GUI ทั้งหมดมีความสามารถในการบันทึกการตั้งค่าการเชื่อมต่อซึ่งรวมถึงชื่อผู้ใช้และรหัสผ่านของคุณ


2
"ตาม GUI" ไม่ได้โดยอัตโนมัติหมายความถึงมันจะช่วยให้การจัดเก็บรหัสผ่านของคุณสิ่งที่ฉาบอย่างชัดเจนปฏิเสธที่จะทำ เวอร์ชั่นของ HyperTerminal ที่มาพร้อมกับ Windows นั้นเป็นรุ่น Telnet เท่านั้นโดยเน้นที่การเชื่อมต่อแบบอนุกรม บางทีคุณอาจนึกถึง CKermit สำหรับ Windows ที่มีการสนับสนุน SSH แต่การสนับสนุนการเข้ารหัสนั้นล้าสมัยไปแล้วมันจะไม่เชื่อมต่อกับเซิร์ฟเวอร์ปัจจุบันจำนวนมากได้อย่างง่ายดาย
grawity
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.