คีย์ ssh จำเป็นต้องมีชื่อว่า id_rsa หรือไม่


130

ฉันเจอปัญหานี้สองสามครั้งเมื่อสร้างเซิร์ฟเวอร์ที่สร้างด้วยการรับรองความถูกต้องคีย์

ฉันสงสัยว่าใครมีประสบการณ์นี้ ฉันมีสองสามปุ่มสำหรับผู้ใช้ปัจจุบันของฉันที่อาจเชื่อมต่อกับเครื่องที่แตกต่างกัน สมมติว่า machine1 และ machine2 ฉันได้วางกุญแจสาธารณะของฉันลงในไฟล์ authorized_keys ที่เกี่ยวข้องแล้ว อันแรกที่ฉันมีชื่อ id_rsa กุญแจแรกและดัดกุญแจที่สอง

เมื่อฉันพยายามที่จะเชื่อมต่อกับช่างดัดฉันได้รับผลลัพธ์ต่อไปนี้ด้วยการเชื่อมต่อ verbose ssh ของฉัน

debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey
debug1: Next authentication method: publickey
debug1: Trying private key: /home/bozo/.ssh/.ssh/identity
debug1: Trying private key: /home/bozo/.ssh/.ssh/id_rsa
debug1: Trying private key: /home/bozo/.ssh/id_dsa
debug1: No more authentication methods to try.
Permission denied (publickey).

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

ฉันขอขอบคุณภาพรวมเกี่ยวกับวิธีที่ผับและคีย์ส่วนตัวโต้ตอบกับไคลเอนต์และเซิร์ฟเวอร์ ฉันคิดว่าฉันมีความคิดที่ดี แต่ดูเหมือนว่าฉันขาดอะไรบางอย่างไป

กรุณาและขอบคุณ

คำตอบ:


156

โดยค่าเริ่มต้น ssh ค้นหาid_dsaและid_rsaไฟล์ ปุ่มไม่จำเป็นต้องตั้งชื่อเช่นนี้คุณสามารถตั้งชื่อได้mykeyเช่นกันหรือแม้แต่วางไว้ในไดเรกทอรีอื่น อย่างไรก็ตามหากคุณทำอย่างใดอย่างหนึ่งคุณจำเป็นต้องอ้างอิงคีย์อย่างชัดเจนในคำสั่ง ssh ดังนี้:

ssh user@server -i /path/to/mykey

หากคำสั่งไม่ยอมรับ-iเช่นsshfsใช้IdentityFileตัวเลือก:

sshfs -o IdentityFile=/path/to/mykey user@host:/path/on/remote /mountpoint

มันทำงานอย่างไร

เมื่อสร้างคีย์คุณจะได้รับสองไฟล์: id_rsa(ไพรเวตคีย์) และid_rsa.pub(พับลิกคีย์) ตามชื่อของพวกเขาแนะนำว่าควรเก็บรหัสส่วนตัวเป็นความลับและรหัสสาธารณะสามารถเผยแพร่สู่สาธารณะได้

การรับรองความถูกต้องของรหัสสาธารณะทำงานได้กับกุญแจสาธารณะและกุญแจส่วนตัว ทั้งไคลเอนต์และเซิร์ฟเวอร์มีคีย์ของตัวเอง เมื่อติดตั้งopenssh-serverคีย์สาธารณะและเซิร์ฟเวอร์ส่วนตัวจะถูกสร้างขึ้นโดยอัตโนมัติ สำหรับลูกค้าคุณต้องทำด้วยตัวเอง

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

เซิร์ฟเวอร์จะตรวจสอบว่าคุณได้รับอนุญาตให้เชื่อมต่อ (กำหนดไว้ใน/etc/ssh/sshd_config) และหากรหัสสาธารณะของคุณอยู่ใน~/.ssh/authorized_keysไฟล์หรือไม่ สาเหตุที่เป็นไปได้ที่ทำให้รหัสสาธารณะถูกปฏิเสธ:

  • /etc/ssh/sshd_config:
    • AllowUsersหรือAllowGroupsมีการระบุไว้ แต่ผู้ใช้เซิร์ฟเวอร์ของคุณไม่ได้อยู่ในรายชื่อกลุ่มหรือรายชื่อผู้ใช้ (ไม่ได้กำหนดค่าเริ่มต้นทำให้ไม่มีการ จำกัด ผู้ใช้หรือกลุ่มจากการเข้าสู่ระบบ)
    • DenyUsersหรือDenyGroupsมีการระบุไว้และคุณอยู่ในรายการผู้ใช้หรือกลุ่ม
    • คุณกำลังพยายามเข้าสู่ระบบในฐานะรูท แต่PermitRootLoginตั้งค่าเป็นNo(ค่าเริ่มต้นyes)
    • PubkeyAuthenticationถูกตั้งค่าเป็นNo(ค่าเริ่มต้นyes)
    • AuthorizedKeysFileถูกตั้งค่าเป็นตำแหน่งอื่นและไม่มีการเพิ่มกุญแจสาธารณะในไฟล์นั้น (ค่าเริ่มต้น.ssh/authorized_keysสัมพันธ์กับ home dir)
  • ~/.ssh/authorized_keys: คีย์สาธารณะของคุณไม่ถูกเพิ่มในไฟล์นี้ (โปรดทราบว่าไฟล์นี้ถูกอ่านในฐานะผู้ใช้รูท)

ใช้หลายปุ่ม

ไม่ใช่เรื่องแปลกที่จะใช้ปุ่มหลายปุ่ม แทนที่จะใช้งานssh user@host -i /path/to/identity_fileคุณสามารถใช้ไฟล์กำหนดค่า, ~/.ssh/config.

การตั้งค่าทั่วไปคือ IdentityFile (ปุ่ม) และพอร์ต การกำหนดค่าถัดไปจะตรวจสอบ "id_dsa" และ "bender" เฉพาะเมื่อเชื่อมต่อกับssh youruser@yourhost:

Host yourhost
   IdentityFile ~/.ssh/id_dsa
   IdentityFile ~/.ssh/bender

หากคุณข้ามHost yourhostการตั้งค่าจะมีผลกับการเชื่อมต่อ SSH ทั้งหมด ตัวเลือกอื่น ๆ นอกจากนี้ยังสามารถที่กำหนดไว้สำหรับการแข่งขันโฮสต์นี้เช่นUser youruser, Port 2222ฯลฯ ซึ่งจะช่วยให้คุณเชื่อมต่อกับชวเลขแทนssh yourhostssh -p2222 youruser@yourhost -i ~/.ssh/id_dsa -i ~/.ssh/bender


1
ทำไมฉันต้องระบุรหัส จุดทั้งหมดคือเพื่อให้ฉันสามารถ ssh กับเครื่องได้ง่ายขึ้น
myusuf3

2
@StevenRoose จากssh_config(5): ชื่อไฟล์อาจใช้ไวยากรณ์ tilde เพื่ออ้างถึงโฮมไดเร็กตอรี่ของผู้ใช้หรือหนึ่งในตัวอักษรต่อไปนี้: '% d' (โฮมไดเร็กตอรี่ของผู้ใช้ในพื้นที่), '% u' (ชื่อผู้ใช้ท้องถิ่น), '% l '(ชื่อโฮสต์ท้องถิ่น),'% h '(ชื่อโฮสต์ระยะไกล) หรือ'% r '(ชื่อผู้ใช้ระยะไกล) ไม่สามารถระบุไวด์การ์ดได้ แต่มันควรจะสะดวกพอที่จะเดา โปรดระวังว่าเซิร์ฟเวอร์จะต้องสอบสวนแต่ละคีย์ที่คุณส่งดังนั้นการระบุคีย์ที่น้อยลงจะดีกว่า ssh_config(5)สัญลักษณ์ตัวแทนในการทำงานพิธีกรมองเห็นอีกครั้งหน้าคู่มือของ
Lekensteyn

2
@therobyouknow คุณไม่จำเป็นต้องสร้างคู่คีย์ที่ไม่ซ้ำกันสำหรับทุกเครื่อง โดยปกติคุณจะมีคีย์ไม่กี่ตัวและต่อท้ายพับลิกคีย์ของหนึ่งในคีย์ไปยัง.ssh/authorized_keysไฟล์บนเครื่องรีโมต หากคุณใช้.ssh/id_rsaชื่อไฟล์มาตรฐาน(หรือ id_dsa, id_ecdsa หรือ id_ed25519 ล่าสุด) ssh จะลองทำสิ่งนี้โดยอัตโนมัติและคุณไม่จำเป็นต้องระบุIdentityFileใน config ของคุณ (หรือ-i path/to/id_fileพารามิเตอร์สำหรับssh)
Lekensteyn

4
ฉันชอบคำตอบที่มากกว่ารายละเอียดที่กำหนดและใช้เวลาอธิบายแนวคิด งานที่ยอดเยี่ยม! +1
user2490003

1
@landed เป็นโฮสต์ของเซิร์ฟเวอร์ SSH (อาจเป็นที่อยู่ IP หรือชื่อ DNS) ฉันพยายามอธิบายส่วนนั้นหวังว่าจะช่วยได้
Lekensteyn

40

วิธีโปรดของฉันอนุญาตให้เลือกคีย์ส่วนตัวโดยอัตโนมัติ

IdentityFile ~/.ssh/%l_%r@%h_id_rsa

SSH จะแทนที่% l ด้วยชื่อเครื่องโลคัล% r ด้วยชื่อผู้ใช้รีโมตและ% h ด้วยรีโมตโฮสต์ดังนั้นหากฉันต้องการเชื่อมต่อจากเครื่องของฉันชื่อ foo to bar ในฐานะผู้ใช้ฉันเรียกใช้:

ssh bar

และ ssh จะใช้โดยอัตโนมัติ:

~/.ssh/foo_user@bar_id_rsa

ในขณะที่โฮสต์โลคัลถูกเก็บไว้สิ่งนี้จะช่วยให้สามารถแชร์โฮมไดเรกทอรีผ่าน NFS (คีย์ที่แตกต่างกันต่อเครื่อง!) หรือแม้กระทั่งการระบุเครื่องที่คีย์นั้นต้องการให้อยู่ใน ...


1

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

ฉันสร้าง symlink ให้กับกุญแจที่ฉันต้องการใช้ในเวลาและเนื่องจากการเปลี่ยนแปลงเพียงไม่นานขึ้นอยู่กับโครงการที่ฉันกำลังทำอยู่ฉันมีความสุขกับมัน

ที่นี่ฉันได้เชื่อมโยงไปยังกุญแจของฉันสำหรับเครื่องที่ทำงานภายใต้ virtualbox:

$ cd .ssh/
$ ln -s adam_vbox-id_rsa.pub id_rsa.pub
$ ln -s adam_vbox-id_rsa id_rsa

$ ls -l
total 12
-rw------- 1 adam adam 1675 2013-10-04 02:04 adam_vbox-id_rsa
-rw-r--r-- 1 adam adam  396 2013-10-04 02:04 adam_vbox-id_rsa.pub
lrwxrwxrwx 1 adam adam   16 2013-10-04 02:17 id_rsa -> adam_vbox-id_rsa
lrwxrwxrwx 1 adam adam   20 2013-10-04 02:17 id_rsa.pub -> adam_vbox-id_rsa.pub
-rw-r--r-- 1 adam adam 3094 2013-10-04 02:09 known_hosts

หนึ่งสามารถเพิ่มสคริปต์อย่างรวดเร็วจริง ๆ เพื่อเปลี่ยนเป็นชุดอื่นโดยไม่ต้องพิมพ์คำสั่งlnด้วยตนเองอีกครั้ง

อีกครั้งนี่ไม่ใช่วิธีแก้ปัญหาสำหรับสองปุ่มเท่านั้น แต่สำหรับจำนวนที่มากขึ้นมันอาจใช้การได้


1
ฉันเพิ่งเพิ่มนามแฝงด้วยโดย bash_profile สำหรับแต่ละเซิร์ฟเวอร์ที่ฉันทำงานด้วย ดังนั้นสำหรับเซิร์ฟเวอร์ที่เรียกว่า bob ฉันมีสิ่งนี้ ... alias bob = "ssh bob.example.com -l pete -i / path / to / key" - จากนั้นฉันพิมพ์ bob - และฉันก็เข้า!
Peter Bagnall

2
ในขณะที่บางครั้งการ "ทำให้สิ่งต่าง ๆ เป็นไปตามที่คุณรู้" ง่ายกว่า แต่ก็มีวิธีที่ง่ายกว่าถ้าคุณตั้งค่าคีย์. ssh / configs และโฮสต์ ความคิดเห็นนี้กำกับที่ทั้งโปสเตอร์ความคิดเห็นและผู้แสดงความคิดเห็น @ Peter-Bagnall
Scott Prive
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.