วิธีการใช้คีย์ส่วนตัว SSH เพื่อเข้าสู่ระบบโดยไม่ต้องใส่ข้อความรหัสผ่านทุกครั้งบน Mac OS X Lion?


23

ฉันใช้ Mac OS X Lion และล็อกอินโฮสต์ระยะไกลผ่าน SSH ทุกวัน แม้ว่าข้อเท็จจริงที่ว่าฉันใช้คู่คีย์ SSH สำหรับการรับรองความถูกต้องระยะไกลและฉันไม่จำเป็นต้องใช้วลีการเข้าสู่ระบบของโฮสต์ทุกเครื่อง แต่ก็ยังน่ารำคาญมากที่เทอร์มินัลขอรหัสผ่านสำหรับการเข้าถึงคีย์ส่วนตัว SSH ของฉัน

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

มีสคริปต์ที่เรียกว่าkeychainทำงานได้ดีบน Gentoo Linux แต่ฉันไม่เคยคิดออกใน Mac OS X Lion ยิ่งไปกว่านั้นยังมีเงื่อนไขที่น่ากลัวมากมายเช่นssh-agent, ssh-add. หลังจากอ่านเนื้อหาต่าง ๆ เกี่ยวกับชุดเครื่องมือ SSH เหล่านั้นและทำการทดลองที่ทำให้ผิดหวังฉันก็สับสนมากขึ้น

ดังนั้นฉันมาที่ StackExchange ค้นหาคำแนะนำเกี่ยวกับคำถามต่อไปนี้

  1. อะไรคือssh-agent, ssh-addและkeychain, Keychain Access.appพวกเขามีปฏิสัมพันธ์กันอย่างไร?
  2. ฉันจะป้อนวลีรหัสผ่านสำหรับคีย์ส่วนตัว SSH ของฉันหนึ่งครั้งได้ที่ล็อกอินและใช้อย่างอิสระในการสร้างเซสชัน SSH ในภายหลัง
  3. เอ่อ ... เกิดอะไรขึ้นเนี่Keychain Access.appย? ไม่เก็บวลี SSH เหมือนที่เคยทำมา

ฉันแสดงรายการสิ่งที่ฉันทำที่นี่ หวังว่าจะมีเบาะแสเกี่ยวกับขั้นตอนที่ฉันพลาดไป

ขั้นตอนที่ 1 สร้างคู่คีย์ SSH บน Mac ของฉัน

$ ssh-keygen -t rsa -C "me@email.com"
# Set a passphrase for accessing the private key.

ขั้นตอนที่ 2 คัดลอกกุญแจสาธารณะ SSH ของฉันไปยังโฮสต์ระยะไกล เพื่อยกตัวอย่างฉันคัดลอกกุญแจไปยัง localhost, Mac

$ ssh-copy-id USER@localhost
# Enter the login password for USER at localhost, not my SSH passphrase

ขั้นตอนที่ 3 จากนั้นลองเชื่อมต่อกับโฮสต์ระยะไกล (localhost ที่นี่) ผ่านการตรวจสอบความถูกต้องของคู่คีย์ SSH

$ ssh USER@locahost
Enter passphrase for key '/Users/YOUR_ACCOUNT/.ssh/id_rsa': 
# Enter my SSH passphrase, not the login password.

ขั้นตอนที่ 4. ออกจากระบบจากโฮสต์ระยะไกลและลองเชื่อมต่ออีกครั้ง ประณามเทอร์มินัลถามหาวลี SSH อีกครั้ง

คำถามที่พบบ่อยคือ "เอสเอสเอสทำงานได้ดีบน Mac ของคุณหรือไม่" พูดตรงไปตรงมาฉันไม่รู้ว่าเกิดอะไรขึ้นกับสิ่งเหล่านี้ ที่นี่แสดงผลการทำงานบางอย่าง

$ echo $SSH_AUTH_SOCK
/tmp/launch-M48niA/Listeners
$ echo $SSH_AUTH_PID
(EMPTY)
$ ssh-add -l
Could not open a connection to your authentication agent.
$ ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-Z54zXukQiP/agent.26769; export SSH_AUTH_SOCK;
SSH_AGENT_PID=26770; export SSH_AGENT_PID;
echo Agent pid 26770;
$ ssh-add -l
Could not open a connection to your authentication agent.
$ echo $SSH_AUTH_SOCK
/tmp/launch-M48niA/Listeners
$ echo $SSH_AUTH_PID
(STILL EMPTY)
$ ssh-agent  # Oh no, anther ssh-agent with different PID
SSH_AUTH_SOCK=/tmp/ssh-cx0B4FUX8B/agent.26898; export SSH_AUTH_SOCK;
SSH_AGENT_PID=26899; export SSH_AGENT_PID;
echo Agent pid 26899;
$ ps -e | grep -i ssh
26769 ??         0:00.03 ssh-agent
26899 ??         0:00.02 ssh-agent

ข้อเสนอแนะใด ๆ ยินดี ขอบคุณ!


ที่เกี่ยวข้อง โอกาสที่คุณจะสามารถปรับคำตอบที่ยอมรับสำหรับกรณีการใช้งานของคุณ
Daniel Beck

คำตอบ:


12

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

ใน OS X เช่นเดียวกับ Leopard คุณไม่จำเป็นต้องเรียกใช้ssh-agentหรือssh-addด้วยตนเอง มันควรจะ "เพิ่งเกิดขึ้น" เมื่อคุณพยายามเชื่อมต่อกับเซิร์ฟเวอร์ หนึ่งครั้งต่อคีย์มันจะแจ้งให้คุณพร้อมกล่องโต้ตอบรหัสผ่าน UI ซึ่ง (เหนือสิ่งอื่นใด) จะช่วยให้คุณสามารถเพิ่มคีย์โดยอัตโนมัติเพื่อssh-agentให้คุณไม่เคยได้รับแจ้งอีก

นี่คือการจัดการโดยมีการlaunchdกำหนดค่าที่ฟังสำหรับการเชื่อมต่อบน$SSH_AUTH_SOCKซ็อกเก็ตและเปิดโดยอัตโนมัติssh-agentเมื่อมันต้องการ; หลังจากนั้นssh-agentจะพร้อมท์ให้คุณใส่ข้อมูลรับรองเฉพาะเมื่อจำเป็นต้องเปิดคีย์ใหม่

หากไม่ทำงานตรวจสอบให้แน่ใจว่าคุณมีlaunchdไฟล์กำหนดค่าที่ถูกต้องอยู่:

/System/Library/LaunchAgents/org.openbsd.ssh-agent.plist

หากยังไม่ได้ผลสำหรับคุณด้วยเหตุผลบางอย่างต่อไปนี้เป็นวิธี "แบบเก่า" ในการทำให้สิ่งต่างๆดำเนินไปด้วยมือ:

http://timesinker.blogspot.com/2007/08/getting-ssh-agent-going-on-mac-osx.html

นอกจากนี้ยังมีแอปพลิเคชันนี้ซึ่งฉันหยุดใช้ตั้งแต่ Leopard ออกมา แต่โดยทั่วไปแล้วก็ทำสิ่งเดียวกันใน Mac OS X เวอร์ชั่นก่อนหน้า:

http://www.sshkeychain.org/


4
ขอบคุณ Michael Edenfield ฉันพบว่าเกิดอะไรขึ้นและตอนนี้ ssh-login-without-passphrase ทำงานได้อย่างสมบูรณ์บน Mac OS X Lion ฉันทำสิ่งที่โง่ - ฉันได้สร้างลิงก์สัญลักษณ์ที่~/tmpชี้ไปที่/tmp/และเรียกใช้งาน cron เพื่อทำความสะอาด~/tmpทุก 2 ชั่วโมงซึ่งยังลบซ็อกเก็ต ssh-agent ด้วย โอ้มนุษย์ฉันเกลียดตัวเอง
Jianwen W.

13

ระหว่างขั้นตอนของการแก้ไข "ปัญหา" ที่ฉันได้ googled หัวข้อที่เกี่ยวข้องบางส่วนและเขียนลงบันทึกบางอย่างเกี่ยวกับวิธีการssh-agent, ssh-add, keychain, KeyChain Access.appทำงาน ในที่สุดมันกลับกลายเป็นว่าปัญหานี้ไม่ใช่ปัญหาเลย แต่ปัญหาก็คือทั้งหมดที่เกี่ยวกับฉันและเรียกว่าssh-login- โดยไม่ต้องถาม - passphrase- ทุกครั้งทำงานได้อย่างสมบูรณ์บน Mac นอกกรอบ

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

ข้อกำหนดรหัสผ่านสองข้อ:

  • passphrase อ้างถึงวลีที่ต้องการเมื่อเข้าถึงกุญแจส่วนตัว SSH ของคุณ
  • password อ้างถึงวลีที่จำเป็นในการเข้าสู่ระบบ Mac ของคุณ

ตอนนี้ผมสามารถคิดออกว่าชุดเครื่องมือเหล่านี้, ที่อยู่, ssh-agent, ssh-add, keychain, Keychain Access.appบน Mac

  • ssh-agentเป็นบริการที่สำคัญในการเปิดใช้งานการใช้คีย์ส่วนตัว SSH โดยไม่ต้องพิมพ์ข้อความรหัสผ่านของ SSH ssh-agentทำงานด้วยวิธีนี้ ก่อนอื่นจะเก็บหรือแคชคีย์ส่วนตัว SSH ของคุณในหน่วยความจำหลัก จากนั้นในภายหลังในเซสชั่นนี้เมื่อคีย์ SSH ส่วนตัว SSH ของคุณเป็นสิ่งจำเป็นสำหรับการรับรองความถูกต้องจากระยะไกลssh-agentจะพบกุญแจส่วนตัวของคุณในหน่วยความจำหลักและมอบให้กับกระบวนการระยะไกล โอกาสเดียวที่คุณจะถูกขอให้พิมพ์ข้อความรหัสผ่าน SSH ของคุณคือเมื่อเพิ่มรหัสส่วนตัวของคุณssh-agentในตอนแรก
  • ssh-addเป็นส่วนหนึ่งของssh-agentคอลเลกชันที่ช่วยในการจัดการคีย์ SSH ssh-agentของคุณ เราใช้ssh-addคำสั่งเพื่อแสดงรายการเพิ่มลบคีย์ส่วนตัวใน keyring ของ ssh-agent จากนั้นssh-addสื่อสารกับssh-agentบริการเพื่อทำภารกิจให้สำเร็จ
  • keychainเป็นสคริปต์เพื่อค้นหาssh-agentบริการ (หากไม่มีอยู่ให้เริ่มใหม่) และเรียกssh-addเพื่อเพิ่มคีย์ส่วนตัว SSH keychainมีแนวคิดที่เรียบง่ายและตรงไปตรงมาทำงานได้ดีบน Linux โดยที่ ssh-agent มักจะไม่เริ่มทำงานโดยอัตโนมัติ
  • Keychain Access.appน่าจะเป็นองค์ประกอบที่ซับซ้อนที่สุด เป็นบริการเก็บข้อมูลโทเค็นสากลของ Mac OS X มันเก็บโทเค็นต่าง ๆ เช่นรหัสผ่าน certs และอื่น ๆ และทำหน้าที่เป็นตัวแทนโทเค็นสำหรับแอพเหล่านั้นที่ร้องขอโทเค็น ในกรณีคีย์ส่วนตัว SSH ของเราอันดับแรกจะคว้าคำขอเข้าถึงคีย์ส่วนตัว SSH และเปิดหน้าต่างขึ้นเพื่อขอให้คุณจัดเก็บวลีรหัสผ่าน SSH ซึ่งเป็นโทเค็นประเภทหนึ่งลงในKeychain Access.appพวงกุญแจของ SSH จากนั้นในครั้งต่อไปที่คุณจะต้องใช้กุญแจส่วนตัวสำหรับการตรวจสอบความถูกต้องให้Keychain Access.appเปิดหน้าต่างอีกครั้งโดยถามว่าให้สิทธิ์พิเศษหรือไม่ หลังจากได้รับขนาดใหญ่แล้วkeychain Access.appเพิ่มรหัสส่วนตัวของคุณในssh-agentที่เก็บข้อมูล

สองสิ่งที่สมควรได้รับความสนใจของคุณ:

  1. Mac OS X Lion จะเริ่มssh-agentบริการโดยอัตโนมัติเมื่อเริ่มต้นทำงานโดยฟังจากซ็อกเก็ตที่อยู่ด้าน/tmpล่าง
  2. Keychain Access.appเก็บวลีรหัสผ่าน SSH ของคุณเพื่อให้สามารถเพิ่มรหัสส่วนตัวของคุณลงในssh-agentโดยไม่รบกวนคุณ ใช่ไม่จำเป็นต้องพิมพ์วลี SSH ของคุณ แต่จำเป็นต้องพิมพ์รหัสผ่านการเข้าสู่ระบบของบัญชี Mac ของคุณเพื่อรับสิทธิ์เมื่อสร้างรายการนี้เป็นครั้งแรก

ดังนั้นโดยสรุปSSH- เข้าสู่ระบบโดยไม่ถาม - รหัสผ่านควรทำงานบน Mac OS X ออกจากกล่อง


1

ในกรณีที่โซลูชันอื่น ๆ ที่นี่ไม่ทำงานสำหรับคนต่อไปนี้ใช้งานได้สำหรับฉัน

สำหรับแต่ละคีย์ส่วนตัวในไดเรกทอรี ~ / .ssh ของคุณตรวจสอบให้แน่ใจว่ามีรหัสสาธารณะที่เกี่ยวข้องเช่นกัน ตรวจสอบให้แน่ใจว่าคีย์สาธารณะนั้นมีชื่อเหมือนกับคีย์ส่วนตัว แต่จะ.pubอยู่ที่ท้าย หากคุณมีรหัสสาธารณะที่เหมาะสมให้ลองสร้างรหัสใหม่

หากคุณต้องการสร้างกุญแจสาธารณะใหม่คุณสามารถทำได้อย่างง่ายดาย: -

ssh-keygen -y -f ~/.ssh/my_key > ~/.ssh/my_key.pub

แทนที่my_keyด้วยสิ่งที่สำคัญของคุณเรียกว่า

หลังจากนั้น MacOS จะจดจำวลีรหัสผ่านที่สำคัญในพวงกุญแจตามที่ควร

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

(มาจากคำตอบของคำถามที่คล้ายกันใน Apple Stack Exchange)


1

สิ่งหนึ่งที่ฉันไม่ค่อยพบกล่าวถึงเกี่ยวกับการกำหนดค่า~/.sshโฟลเดอร์คือการ จำกัด สิทธิ์ของไดเรกทอรี

ในการเปิดใช้งาน ssh เพื่อหลีกเลี่ยงการขอรหัสผ่านฉันต้องตั้งค่าการอนุญาตไดเรกทอรีหลักของผู้ใช้และสิทธิ์การ700ใช้~/.sshโฟลเดอร์700ด้วยเช่นกัน

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


0

สิ่งที่คุณอาจจะได้พยายามอีกก็เคยไปเปลี่ยนกับสิ่งที่ต้องการssh-copy-idk="$(cat ~/.ssh/id_rsa.pub)"; ssh username@somehost.com "umask 0077; mkdir -p ~/.ssh; echo "$k" >> ~/.ssh/authorized_keys2"


0

คำตอบนี้ไม่ใช่คำตอบสำหรับคำถามนี้เล็กน้อย แต่มันอยู่ใกล้มาก (ฉันลงเอยกับคำถามนี้ในขณะที่ค้นหาวิธีแก้ไขปัญหาของฉัน)

ฉันยังทำ SSH ให้กับเซิร์ฟเวอร์ระยะไกลบน Mac ของฉันตามที่อธิบายในคำถามนี้อย่างไรก็ตามKeychain Access.appแอปนี้เก็บข้อความรหัสผ่านไว้และฉันไม่จำเป็นต้องพิมพ์ทุกครั้งที่ฉันต้องการรหัสเพื่อตรวจสอบสิทธิ์บนเซิร์ฟเวอร์ SSH

อย่างไรก็ตามฉันเปิดใช้งานเซิร์ฟเวอร์ SSH บน Mac ของฉันเพื่อให้ฉันสามารถเชื่อมต่อได้จากระยะไกล เมื่อเข้าสู่ระบบจากระยะไกลบน Mac ของฉันข้อความสำคัญจะถูกถามเสมอเมื่อฉันต้องการ SSH ยังเป็นโฮสต์อื่น

ฉันพบวิธีแก้ปัญหาที่อนุญาตให้จัดเก็บคีย์วลีสำหรับเซสชันปัจจุบัน ฉันคิดว่านี่อาจเป็นประโยชน์กับใครบางคนดังนั้นโพสต์ / คำตอบนี้


ฉันเขียนวิธีการแก้ปัญหาที่คล้ายกันของฉันที่นี่superuser.com/a/659668/154113
orkoden

0

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

ฉันไปที่ iMac ของฉันและปิดการใช้งาน sshd ในแผงการตั้งค่าการแชร์ จากนั้นฉันก็ไปรูทและพิมพ์ "/ usr / sbin / sshd -d" เพื่อเริ่มการทำงานของ sshd ในโหมดดีบัก ฉันพยายามที่จะ ssh กับเครื่องนั้นและมันก็พยายามใช้โพรโทคอล 2 ซึ่งทุกอย่างดูเหมือนจะใช้ได้ดี แต่ sshd รายงานโดยทันทีว่าไม่พบ "authorized_keys" ฉันมีไฟล์ authorized_keys2 ที่ linux, solaris ของฉัน, คุณชื่อมันกล่องยูนิกซ์ยอมรับได้ดี ฉันเพิ่งคัดลอก authorized_keys2 ไปที่ authorized_keys และ BOOM ทำงานได้อย่างสมบูรณ์แบบในขณะนี้

ทำไมไม่รู้จักปุ่ม * แทนที่จะเป็น * keys2 โดยเฉพาะอย่างยิ่งเมื่อ OS x มีความสุขมากกับ known_hosts2

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

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