คุณตั้งค่า ssh เพื่อรับรองความถูกต้องโดยใช้คีย์แทนชื่อผู้ใช้ / รหัสผ่านได้อย่างไร


34

คุณจะตั้งค่า ssh เพื่อตรวจสอบสิทธิ์ผู้ใช้โดยใช้กุญแจแทนชื่อผู้ใช้ / รหัสผ่านได้อย่างไร

คำตอบ:


27

สำหรับผู้ใช้แต่ละราย: พวกเขาควรสร้าง (บนเครื่องท้องถิ่น) โดยใช้ keypair ของพวกเขาssh-keygen -t rsa( rsaสามารถถูกแทนที่ด้วยdsaหรือrsa1เกินไปแม้ว่าจะไม่แนะนำตัวเลือกเหล่านั้น) จากนั้นพวกเขาจำเป็นต้องใส่เนื้อหาของกุญแจสาธารณะ ( id_rsa.pub) ลง~/.ssh/authorized_keysในเซิร์ฟเวอร์ที่ล็อกอิน


สิ่งเดียวที่ฉันจะเพิ่มไปนี้คือการดูสิทธิ์ของไฟล์และไดเรกทอรี
เทรนต์

2
อย่าลืม chmod 0700 .ssh chmod 0600 .ssh / authorized_keys
Dave Cheney

3
สร้างคีย์ด้วยวิธีนี้อย่างแน่นอน แต่จากนั้นตรวจสอบโพสต์ของ @Chris Bunch เกี่ยวกับ "ssh-copy-id" นั่นคือวิธีในการถ่ายโอน 'id_rsa.pub' ของคุณ
Gareth

@gyaresu: ขอบคุณ! ฉันเพิ่งเรียนรู้สิ่งใหม่! :-D
Chris Jester-Young

23

ฉันชอบssh-copy-idซึ่งเป็นสคริปต์ที่พบใน * nix โดยค่าเริ่มต้น (สามารถใส่ในMac OS Xได้ง่ายพอเช่นกัน) ซึ่งทำสิ่งนี้ให้คุณโดยอัตโนมัติ จากหน้าคน:

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

นอกจากนี้ยังเปลี่ยนสิทธิ์ของโฮมของผู้ใช้ระยะไกล, ~ / .ssh และ ~ / .ssh / authorized_keys เพื่อลบการเขียนกลุ่ม (ซึ่งจะป้องกันมิให้คุณเข้าสู่ระบบหาก sshd ระยะไกลมีการตั้งค่า StrictModes ในการกำหนดค่า)

หากได้รับตัวเลือก -i ไฟล์ข้อมูลประจำตัว (ค่าเริ่มต้นคือ ~ / .ssh / identity.pub) จะถูกใช้โดยไม่คำนึงว่ามีคีย์ใด ๆ ใน ssh-agent ของคุณหรือไม่


2
@Chris Bunch ทุกคนดูที่นี่! :) ssh-copy-id เป็นวิธีที่แน่นอนในการแบ่งปัน id_rsa.pub ของคน
Gareth

1
เยี่ยมฉันไม่เคยรู้เรื่องนี้เลย ... ฉันเขียนสคริปต์ของตัวเองเพื่อทำสิ่งเดียวกัน: - /
David Z

6

ไม่รับเลย เพียงสร้างคีย์และเริ่มต้นใช้งาน :) HOWTO นอกจากนี้คุณสามารถห้ามเข้าสู่ระบบด้วยรหัสผ่าน ในเช่น / etc / ssh / sshd_config:

PasswordAuthentication no

2
และคุณต้องตั้งค่า UsePAM no (หรือกำหนดค่า PAM ตามลำดับ) มันน่าอัศจรรย์ที่ HOWTO พลาดไม่ได้ในส่วนนี้ การไม่ทำเช่นนั้นจะส่งผลให้คุณยังสามารถเข้าสู่ระบบได้โดยใช้รหัสผ่าน
นาธาน

3

นี้ค่อนข้างตรงไปข้างหน้าจะทำอย่างไร - มีคำแนะนำแบบง่าย ๆ ที่จะพบได้ที่นี่

ประเด็นหลักคือ:

  • ทำงานssh-keygenบนเครื่องของคุณ สิ่งนี้จะสร้างกุญแจสาธารณะและกุญแจส่วนตัวสำหรับคุณ
  • คัดลอกและวางเนื้อหาของกุญแจสาธารณะของคุณ (น่าจะเป็น~/.ssh/id_rsa.pub) เข้าไป~/.ssh/authorized_keysในบนเครื่องระยะไกล

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


ฉันแนะนำให้ตัดและวางแทนการทำสำเนา ไฟล์ authorized_keys สามารถมีได้หลายปุ่มและคุณไม่ต้องการปิดบังคีย์อื่น ๆ ที่อยู่ในนั้น
Chris Jester-Young

คำแนะนำแบบโปรดของฉันถูกส่งมอบให้กับ Wayback Machine: web.archive.org/web/20061103161446/http://…
Philip Durbin

@Chris oops - ฉันตั้งใจจะคัดลอกมันไปยังไฟล์แทนที่จะเขียนทับ! ตอบปรับปรุงตอนนี้เพื่อชี้แจง
ConroyP


1

เพื่อสรุปสิ่งที่ผู้อื่นพูดการตั้งค่าคีย์ SSH นั้นง่ายและมีค่า

บนเครื่องที่คุณจะได้ SSHing จากคุณต้องสร้างคู่คีย์ของคุณ:

claudius:~$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/dinomite/.ssh/id_rsa): <ENTER>
Enter passphrase (empty for no passphrase): <PASSPHRASE>
Enter same passphrase again: <PASSPHRASE>
Your identification has been saved in /home/dinomite/.ssh/id_rsa.
Your public key has been saved in /home/dinomite/.ssh/id_rsa.pub.
The key fingerprint is:
a3:93:8c:27:15:67:fa:9f:5d:42:3a:bb:9d:db:93:db dinomite@claudius

เพียงกด Enter ที่บันทึกไว้และป้อนวลีรหัสผ่านเมื่อได้รับแจ้ง - ความนึกคิดนี้แตกต่างจากรหัสผ่านการเข้าสู่ระบบปกติของคุณทั้งบนโฮสต์ปัจจุบันและโฮสต์ที่คุณจะ SSHing

ถัดไปคุณต้องคัดลอกคีย์ที่คุณเพิ่งสร้างขึ้นเพื่อโฮสต์ที่คุณต้องการที่จะ SSH ไป ลีนุกซ์ส่วนใหญ่มีเครื่องมือssh-copy-idสำหรับทำสิ่งนี้:

claudius:~$ ssh-copy-id caligula.dinomite.net
Now try logging into the machine, with "ssh 'caligula.dinomite.net'", and check in:

  .ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.

หากการแจกจ่ายของคุณไม่มีสิ่งนั้นคุณควรคัดลอกคีย์ไปยังโฮสต์ปลายทางและเพิ่มลงในไฟล์ (อาจมีอยู่) .ssh/authorized_keys:

claudius:~$ scp .ssh/id_dsa.pub caligula.dinomite.net:
id_dsa.pub                                    100% 1119     1.1KB/s   00:00
claudius:~$ ssh caligula.dinomite.net
Last login: Sat May  9 10:32:30 2009 from claudius.csh.rit.edu
Caligula:~$ cat id_dsa.pub >> .ssh/authorized_keys

สุดท้ายเพื่อให้ได้ประโยชน์สูงสุดจากกุญแจ SSH คุณจะต้องเรียกใช้ตัวแทน SSH หากคุณใช้สภาพแวดล้อมเดสก์ท็อป (Gnome, KDE และอื่น ๆ ) เพียงแค่ออกจากระบบและกลับเข้ามาใหม่จะเริ่มตัวแทน SSH ให้คุณ ถ้าไม่ได้คุณสามารถเพิ่มต่อไปนี้เพื่อเปลือกของคุณแฟ้ม RC ( .bashrc, .profileฯลฯ ):

SSHAGENT=/usr/bin/ssh-agent
SSHAGENTARGS="-s"
if [ -z "$SSH_AUTH_SOCK" -a -x "$SSHAGENT" ]; then
    eval `$SSHAGENT $SSHAGENTARGS`
trap "kill $SSH_AGENT_PID" 0
fi

1

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

จะต้องมี~/.sshไดเรกทอรีchmod 700ในแต่ละเครื่องภายใต้บัญชีที่จะมาหรือรับการเชื่อมต่อ

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

อย่าลืมว่าโดยค่าเริ่มต้นคีย์อ่อนแอ (<2048 บิต DSA) จะไม่ได้รับการยอมรับจาก sshd รุ่นล่าสุด

ต้องทำสิ่งต่อไปนี้บนเครื่องฝั่งไคลเอ็นต์เพื่อสร้างการเชื่อมต่อ

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

  2. chmod 600คีย์ส่วนตัวของคุณจะต้อง

  3. chmod 700ตรวจสอบว่าโฮมโฟลเดอร์ของคุณ

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

  1. รหัสสาธารณะของคุณจะต้องอยู่ในไฟล์ที่เรียกว่า~/.ssh/authorized_keysภายใต้บัญชีที่จะได้รับการเชื่อมต่อ คุณสามารถวางกุญแจอื่น ๆ ที่ได้รับอนุญาตให้เชื่อมต่อผ่านบัญชีนี้ได้ที่นี่เช่นกัน สิ่งที่ยุ่งยากโดยเฉพาะอย่างยิ่งถ้าคุณอยู่ใน vi และวางกุญแจลงในไฟล์จาก paste buffer ใน PuTTY คือ: คีย์เริ่มต้นด้วย "ssh-" หากคุณไม่ได้อยู่ในโหมดแทรกตัวแรก "s" จะใส่ vi ในโหมดแทรกและปุ่มที่เหลือจะดูดี แต่คุณจะพลาด "s" ที่จุดเริ่มต้นของคีย์ ฉันใช้เวลาหลายวันกว่าจะพบว่า
  2. chmod 600 ~/.ssh/authorized_keysผมชอบที่จะ อย่างน้อยต้องเป็น gw
  3. ตอนนี้คุณต้องเพิ่มลายนิ้วมือโฮสต์ลงในแคช ไปที่เครื่อง A และ ssh ไปยังเครื่อง B ด้วยตนเอง ในครั้งแรกคุณจะได้รับข้อความเช่น "คุณต้องการเพิ่ม... ไปยังแคชคีย์โฮสต์หรือไม่" หากคุณพยายามรับการทำงานอัตโนมัติ (เช่นสคริปต์) เพื่อใช้การเข้าสู่ระบบนี้คุณต้องให้แน่ใจว่าไคลเอ็นต์ ssh ที่ใช้โดยการดำเนินการอัตโนมัติจะไม่ได้รับพรอมต์นี้

0

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

สำหรับรายละเอียดเพิ่มเติม แต่ผมขอแนะนำให้SSH, The Secure Shell


0

มีคำแนะนำดีๆอยู่ที่นี่ดังนั้นฉันจะไม่พูดซ้ำ เมื่อคุณตั้งค่าเซิร์ฟเวอร์หนึ่งเครื่องเพื่ออนุญาตให้คุณลงชื่อเข้าใช้ด้วยคีย์คุณสามารถตั้งค่าให้ผู้อื่นทำเช่นเดียวกันด้วยสายการบินนี้:

remote=server1 server2 server3 server4
for r in $remote; do echo connecting to $r; tar czf - ./.ssh/id*.pub ./.ssh/authorized_keys2 ./.ssh/config | ssh $r "tar zxf -; chmod 700 .ssh" ; done

เพียงแค่ cd ไปที่โฮมไดเร็กตอรี่ของคุณ, ให้นิยามตัวแปรรีโมตเป็นชื่อเซิร์ฟเวอร์หนึ่งชื่อหรือหลายชื่อ รหัสผ่านที่ขอจะเป็นรหัสผ่าน ssh ของคุณสำหรับเซิร์ฟเวอร์ระยะไกล แน่นอนว่าคุณสามารถใช้เวอร์ชันที่ง่ายขึ้นได้โดยไม่ต้องใช้ for-loop:

tar czf - ./.ssh/id*.pub ./.ssh/authorized_keys2 ./.ssh/config | ssh YOUR_SERVER_NAME_HERE "tar ztvf -; chmod 700 .ssh"

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

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