วิธีการใช้ Mac OS X Keychain กับปุ่ม SSH


140

ฉันเข้าใจว่าตั้งแต่ Mac OS X Leopard พวงกุญแจรองรับการเก็บคีย์ SSH ใครช่วยกรุณาอธิบายว่าคุณลักษณะนี้ควรจะทำงานอย่างไร

ฉันมีคีย์ RSA บางตัวที่ฉันสร้างขึ้นเก็บไว้ในไดเรกทอรี ~ / .ssh ของฉันเพื่อเข้าถึงเซิร์ฟเวอร์ต่างๆ ฉันไม่ได้ตั้งข้อความรหัสผ่านบนคีย์เหล่านั้น ขณะนี้เพื่อเข้าสู่เซิร์ฟเวอร์เหล่านั้นฉันใช้คำสั่งต่อไปนี้ใน Terminal:

eval `ssh-agent '
ssh-add ~ / .ssh / some_key_rsa
ssh user @ เซิร์ฟเวอร์

(ฉันได้เขียนฟังก์ชัน Bash บางอย่างเพื่อทำให้ง่ายขึ้น)

มีวิธีที่ดีกว่านี้ในการใช้ Keychain หรือไม่

คำตอบ:


16

เพื่อให้การทำงานของตัวแปรสภาพแวดล้อมควรจะชี้ไปที่$SSH_AUTH_SOCK /tmp/launch-xxxxxx/Listenersสิ่งนี้ควรจะทำโดยอัตโนมัติเมื่อคุณเข้าสู่ระบบฟังในซ็อกเก็ตที่พูดโปรโตคอล ssh-agent

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

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

ในที่สุดเมื่อคุณเข้าสู่ระบบครั้งแรกคุณอาจจะไม่เห็นกระบวนการ ssh-agent /tmpกระบวนการที่จะเริ่มต้นโดยอัตโนมัติโดยการให้บริการการเปิดตัวครั้งแรกที่บางสิ่งบางอย่างพยายามอ่านซ็อกเก็ตว่าใน


1
ขอบคุณ ดังนั้นฉันจะยังคงต้องเรียกใช้ssh-addเพื่อเพิ่มข้อมูลประจำตัว RSA ของฉันไปยังตัวแทน ssh เริ่มต้นที่เริ่มต้นเมื่อเข้าสู่ระบบ?
John Topley

คุณไม่จำเป็นต้องเรียกใช้ ssh-add; ssh-agent จะถามรหัสผ่านของคีย์ในครั้งแรกที่คุณเรียกใช้ ssh
Rudedog

3
มันทำให้ฉันใส่รหัสผ่านทุกครั้งที่ฉันเรียกใช้ ssh ประเด็นก็คือฉันไม่ต้องการที่จะต้องป้อนรหัสผ่านใด ๆ
John Topley

1
คุณต้องการรหัสผ่านอะไร ฉันเริ่มสงสัยว่ามันเป็นเซิร์ฟเวอร์ระยะไกลที่แจ้งให้คุณทราบซึ่งทำให้ข้อความของคุณว่าคีย์ของคุณไม่มีข้อความรหัสผ่านในมุมมองที่ดีขึ้น หากคุณต้องการเลี่ยงรหัสผ่านบนเซิร์ฟเวอร์ระยะไกลคุณต้องเพิ่มกุญแจสาธารณะของคุณไปยัง$HOME/.ssh/authorized_keysเซิร์ฟเวอร์นั้น ssh-agent + keychain ของ Mac OS ใช้เพื่อเก็บวลีรหัสผ่านสำหรับคีย์ ssh ในเครื่องของคุณเท่านั้น ไม่ได้หมายถึงการส่งรหัสผ่านระยะไกลผ่านการเชื่อมต่อ ssh ที่มีอยู่
Rudedog

1
ใช้ssh -vเพื่อวินิจฉัยสิ่งที่ ssh กำลังทำอยู่ ใช้sshd -p 8900 -vในฝั่งเซิร์ฟเวอร์และssh -v remote:8900เพื่อวินิจฉัยว่า sshd กำลังทำอะไรอยู่
Rudedog

252

ในฐานะที่เป็น Leopard รุ่นของ OS X, ssh-agent ถูกรวมเข้ากับ Keychain อย่างแน่นหนา เป็นไปได้ที่จะเก็บวลีรหัสผ่านของคีย์ SSH ทั้งหมดของคุณอย่างปลอดภัยใน Keychain ซึ่ง ssh-agent จะอ่านเมื่อเริ่มต้น บรรทัดล่างคือมันง่ายในการรักษาความปลอดภัยกุญแจของคุณด้วยวลีรหัสผ่าน แต่ไม่ต้องพิมพ์วลีรหัสผ่านเพื่อใช้! นี่คือวิธี:

เพิ่มวลีรหัสผ่านให้กับแต่ละคีย์ ssh ไปยังพวงกุญแจ: (ตัวเลือก -k โหลดคีย์ส่วนตัวธรรมดาเท่านั้นข้ามใบรับรอง)

ssh-add -K [path/to/private SSH key]

(โปรดทราบว่าเป็นเมืองหลวง K)

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

ssh-add -l

ssh-add -lไม่แสดงรายการปุ่มใด ๆ เมื่อทำการเชื่อมต่อจากระยะไกล (โดยที่ไม่ได้ตั้งค่า $ DISPLAY) ต้องใช้เทคนิคพิเศษที่นี่เพื่อใช้พวงกุญแจ (เช่นในsuperuser.com/questions/141044/ เป็นต้น )
Ether

2
developer.apple.com/library/mac/documentation/Darwin/Reference/ ...... คุณต้องมีตัวเลือก -K เพื่อเก็บข้อความรหัสผ่านในพวงกุญแจ
Neeme Praks

5
หากคุณติดตั้งรุ่นของ SSH อื่นผ่านระบบแพคเกจเช่น Homebrew /usr/bin/ssh-addแล้วมันเป็นสิ่งจำเป็นที่จะใช้เส้นทางที่แน่นอนเช่น
Ludovic Kuty

1
ที่น่าสนใจใน macOS Sierra ของฉันไม่ขอรหัสผ่านหลังจากรีบูต แต่ssh-add -lส่งคืน "เอเจนต์ไม่มีตัวตน" ( ps auxรวม/usr/bin/ssh-agent -l)
Halil Özgür

4
สำหรับ macOS Sierra สิ่งต่าง ๆ มีการเปลี่ยนแปลง ดูgithub.com/jirsbek/SSH-keys-in-macOS-Sierra-keychain
schieferstapel

79

ในฐานะของmacOS Sierra , ssh-agent จะไม่โหลดอัตโนมัติ ssh ที่โหลดไว้ก่อนหน้านี้อีกต่อไปเมื่อคุณลงชื่อเข้าใช้บัญชีของคุณ นี่เป็นความตั้งใจในส่วนของ Apple พวกเขาต้องการปรับให้สอดคล้องกับการใช้งานหลักของOpenSSH [1]


ตามที่อธิบายไว้ที่นี่เป็นวิธีที่แนะนำตั้งแต่macOS 10.12.2 :

  1. เพิ่มบรรทัดต่อไปนี้ใน~/.ssh/configไฟล์ของคุณ:

    Host *
        UseKeychain yes
        AddKeysToAgent yes
    
  2. คีย์ใด ๆ ที่คุณเพิ่มไปยังssh-agentโดยใช้ssh-add /path/to/your/private/key/id_rsaคำสั่งจะถูกเพิ่มในพวงกุญแจโดยอัตโนมัติและควรถูกโหลดอัตโนมัติเมื่อรีบูต


ต่อไปนี้เลิกใช้แล้ว (เก็บไว้เพื่อการอ้างอิง)

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

  1. ขั้นแรกเพิ่มคีย์ทั้งหมดที่คุณต้องการโหลดโดยอัตโนมัติไปยังssh-agentโดยใช้ssh-add -K /absolute/path/to/your/private/key/id_rsaคำสั่ง -Kโต้แย้งเพื่อให้แน่ใจว่าคีย์ผ่านวลีจะถูกเพิ่มพวงกุญแจของ MacOS ตรวจสอบให้แน่ใจว่าคุณใช้พา ธ สัมบูรณ์ไปยังคีย์ การใช้พา ธ สัมพัทธ์จะทำให้สคริปต์ที่เปิดโดยอัตโนมัติไม่พบกุญแจของคุณ

  2. ssh-add -Aตรวจสอบให้แน่ใจว่าทั้งหมดของคีย์ของคุณจะแสดงเป็นเพิ่มเมื่อคุณพิมพ์

  3. สร้างไฟล์ที่เรียกว่าcom.yourusername.ssh-add.plistใน~/Library/LaunchAgents/ที่มีเนื้อหาดังต่อไปนี้ ใช้ไฟล์ plistเช่นไฟล์นี้launchdเพื่อเรียกใช้สคริปต์เมื่อคุณเข้าสู่ระบบ[2] [3]

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
    <key>Label</key>
      <string>com.user.loginscript</string>
    <key>ProgramArguments</key>
      <array>
        <string>ssh-add</string>
        <string>-A</string>
      </array>
    <key>RunAtLoad</key>
      <true/>
    </dict>
    </plist>
    
  4. บอกlaunchdโหลดไฟล์ plistlaunchctl load ~/Library/LaunchAgents/com.yourusername.ssh-add.plistคุณเพิ่งสร้างขึ้นโดยการดำเนินการ:

และคุณควรจะตั้งค่าทั้งหมด


ที่เกี่ยวข้อง: apple.stackexchange.com/questions/48502/…
slm

33

มีวิธีที่ง่ายกว่าคำตอบของ Ricardo ในการคงรหัสผ่านของคุณระหว่างเซสชัน / รีสตาร์ทเครื่อง Mac ของคุณที่รัน 10.12 Sierra

  1. ssh-add -K ~/.ssh/id_rsa
    หมายเหตุ: เปลี่ยนพา ธ ไปยังที่ตั้ง id_rsa ของคุณ
  2. ssh-add -A
  3. สร้าง (หรือแก้ไขหากมี) ~/.ssh/configไฟล์ต่อไปนี้:

    Host *
      UseKeychain yes
      AddKeysToAgent yes
      IdentityFile ~/.ssh/id_rsa
    

    ตอนนี้รหัสผ่านจะถูกจดจำระหว่างการรีสตาร์ท!

แอปเปิ้ลจงใจเปลี่ยนพฤติกรรมสำหรับตัวแทน ssh ใน MacOS 10.12 เซียในการโหลดคีย์ SSH ก่อนหน้านี้ไม่ได้โดยอัตโนมัติตามที่ระบุไว้ในนี้OpenRadar , การสนทนาทวิตเตอร์และหมายเหตุทางเทคนิคจากแอปเปิ้ล การแก้ปัญหาข้างต้นจะเลียนแบบพฤติกรรมเก่าของ El Capitan และจดจำรหัสผ่านของคุณ


2
เจ๋งมากทำงานเหมือนจับใจ imho สะอาดกว่าคนอื่น ๆ และแก้ไขให้ถูกที่ :) :)
GerardJP


10

หมายเหตุ: สำหรับ MacOS เซียโปรดดูที่เมื่อเร็ว ๆ นี้คำตอบโดย ChrisJF

[การตอบโดย Jeff McCarrell] [2] ที่ถูกต้องยกเว้นว่าคำสั่งเพื่อเพิ่มวลีรหัสผ่านมีห้องน้ำในประแทนยัติภังค์คือ–Kแทนที่จะทำให้ข้อความถึงผลกระทบของ-K –K: No such file or directoryคุณควรอ่าน:

ssh-add -K [path/to/private SSH key]

2
นี่ควรเป็นความเห็นต่อคำตอบที่คุณอ้างถึงไม่ใช่คำตอบใหม่ เรากำลังพูดถึงความปลอดภัยที่นี่ ใคร ๆ ก็แนะนำว่าคุณควรพิมพ์อย่างระมัดระวังมากกว่าคัดลอกและวางสุ่มสี่สุ่มห้าssh-add -K
Phil_1984_

1
illegal option -- Kใช้เครื่องหมายขีดกลางกับภาคที่ผมได้รับ ตัวพิมพ์เล็ก k แสดงรายการเป็นตัวเลือก
Sam Dutton

ขอบคุณสำหรับความคิดเห็น. ฉันเพิ่งตรวจสอบบน macOS Sierra: -Kเช่น dash-capital-K ยังคงใช้งานได้
simonair

6

ฉันสงสัยว่าคุณไม่ได้ใช้sshคำสั่งเริ่มต้น คุณsshติดตั้งผ่านพอร์ตหรือไม่ ลองwhich sshดูsshคำสั่งที่คุณใช้อยู่

โดยปกติแล้วมันจะแสดงกล่องโต้ตอบถามรหัสผ่านของคุณถ้ามันไม่ได้เก็บไว้ในพวงกุญแจคุณ


ฉันไม่ได้ใช้พอร์ต
John Topley

ขอบคุณสำหรับข้อมูล :) ฉันมีปัญหาเพราะฉันใช้ OpenSSH จาก Homebrew
ggustafsson

6

ฉันมีปัญหาที่คล้ายกันในขณะที่พยายามเข้าสู่ระบบโดยใช้ใบรับรอง SSH ลูกค้า ในกรณีเฉพาะนี้เป็นการเข้าถึงที่เก็บ git นี่คือสถานการณ์:

  • บันทึกรหัสแล้ว ~/.ssh/
  • คีย์ส่วนตัวมีวลีรหัสผ่าน
  • ข้อความรหัสผ่านจะถูกเก็บไว้ในพวงกุญแจการเข้าสู่ระบบ OS X ~/Library/Keychains/login.keychain
  • การเชื่อมต่อมีดังนี้: เซิร์ฟเวอร์->mac ->git / ssh รีโมตMac ของฉัน
  • Mac OS X 10.8.5

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

  1. security unlock-keychainข้อความรหัสผ่านจะถูกเก็บไว้ในพวงกุญแจเข้าสู่ระบบ สิ่งนี้จะปลดล็อคและเปิดใช้งาน ssh-agent เพื่อเข้าถึง
  2. eval `ssh-agent -s`เริ่มต้น ssh-agent สำหรับการใช้งานเชลล์ มันจะได้รับข้อความรหัสผ่านจากพวงกุญแจและใช้เพื่อปลดล็อคกุญแจ ssh ส่วนตัว
  3. สร้างการเชื่อมต่อ ssh / git และทำงานของฉัน
  4. eval `ssh-agent -k` ฆ่า ssh-agent ที่กำลังทำงานอยู่
  5. security lock-keychain ล็อคพวงกุญแจอีกครั้ง

1
เพื่อให้ # 2 ในการทำงานสำหรับฉันภายในนามแฝงผมใช้eval \$(ssh-agent)ต่อเรื่องการเข้าสู่ระบบจากระยะไกลและพวงกุญแจ เมื่อไม่อยู่ภายในนามแฝงจะeval $(ssh-agent)ทำงาน ( โดยไม่มีเครื่องหมายแบ็กสแลช $ )
เทรวิส

4

ดูสิ่งนี้ด้วย:

security import priv_key.p12 -k ~/Library/Keychains/login.keychain
security import pub_key.pem -k ~/Library/Keychains/login.keychain

... เพิ่มบันทึกนี้เมื่อมีการร้องขอรายละเอียดเพิ่มเติม: คำสั่ง "ความปลอดภัย" สามารถนำเข้าคีย์ (และสิ่งอื่น ๆ ) ได้โดยตรงในพวงกุญแจ สิ่งที่ดีคือไม่เหมือน ssh-add คุณสามารถระบุพวงกุญแจได้ ทำให้สามารถนำเข้าโดยตรงสู่ระบบ Keychain ("ความปลอดภัยของผู้ชาย" เพื่อเรียนรู้วิธี)


1
โปรดให้รายละเอียดเพิ่มเติมกับคำตอบนี้หน่อยได้ไหม? ขอบคุณ
Matthew Williams

1

ทางออกที่ดีที่สุดและตั้งใจของ Apple (ตั้งแต่ macOS 10.12.2)ได้อธิบายไว้ที่นี่

ดังนั้นให้ทำดังนี้

echo "UseKeychain ใช่" >> ~ / .ssh / config


1
การใช้>>มีความเสี่ยงหากคุณป้อนคำสั่งหลายครั้ง ดีกว่าทำคู่มือฉบับของไฟล์ตามที่อธิบายคำตอบ ChrisJF
Cœur

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