การอนุญาตของ SSH ถูกปฏิเสธ (publickey)


110

ฉันกำลังพยายามเชื่อมต่อกับ Linode (ใช้งาน Ubuntu 12.04 LTS) จากเครื่องของฉัน (เช่นใช้ Ubuntu 12.04 LTS)

ฉันได้สร้างรหัสส่วนตัวและสาธารณะบนเครื่องท้องถิ่นของฉันและคัดลอกกุญแจสาธารณะของฉันไปยังไฟล์ authorized_keys Linode ของฉัน แต่เมื่อใดก็ตามที่ฉันพยายามที่จะ SSH เพื่อ Linode Permission denied (publickey)ของฉันฉันได้รับข้อความแสดงข้อผิดพลาด

ไม่มีปัญหากับการตั้งค่า ssh บน Linode ของฉันเพราะฉันสามารถ ssh จากเครื่อง Windows ของฉันโดยใช้การตรวจสอบสิทธิ์ที่สำคัญ

ใน.sshไดเรกทอรีของฉันบนเครื่อง Ubuntu ในพื้นที่ของฉันฉันมีid_rsaและid_rsa.pubไฟล์ของฉัน ฉันต้องสร้างไฟล์ authorized_keys บนเครื่องของฉันหรือไม่?

แก้ไข: นี่คือสิ่งที่ฉันได้รับเมื่อฉันเรียกใช้ssh -vvv -i id_rsa [youruser]@[yourLinode]:

debug3: authmethod_lookup publickey
debug3: remaining preferred: keyboard-interactive,password
debug3: authmethod_is_enabled publickey
debug1: Next authentication method: publickey
debug1: Offering RSA public key: id_rsa
debug3: send_pubkey_test
debug2: we sent a publickey packet, wait for reply
debug1: Authentications that can continue: publickey
debug2: we did not send a packet, disable method
debug1: No more authentication methods to try.
Permission denied (publickey).

4
1) บันทึกในเซิร์ฟเวอร์ SSH พูดถึงเวลาที่คุณมีข้อผิดพลาดนี้กับลูกค้าอย่างไร ( /var/log/auth.log) 2) คุณถ่ายโอนกุญแจสาธารณะไปยังเซิร์ฟเวอร์ได้อย่างไร ใช้ssh-copy-idเพื่อให้แน่ใจเกี่ยวกับสิทธิ์เสมอ โฮมไดเร็กตอรี่ของคุณ, ได.sshเร็กตอรี่และauthorized_keysไฟล์นั้นมีข้อกำหนดการอนุญาตที่เข้มงวด. (ดู manpage ของsshd(8) บน~/.ssh/authorized_keys) 3) คุณสร้าง keypair ใหม่บน Ubuntu หรือไม่? ในกรณีที่คุณนำกุญแจกลับมาใช้ใหม่จาก Windows คุณจะต้องแปลงเป็นรูปแบบ OpenSSH ก่อน
gertvdijk

1
คำสั่งควรได้รับssh -vvv -i .ssh/id_rsa ....(จดเส้นทางไปยัง id_rsa!) - โปรดแทนที่ - บันทึกเก่าแสดงเฉพาะว่า "เรา" ไม่มี pubKey ที่จะส่ง
guntbert

@guntbert ฉันพลาด. ssh เพราะฉันอยู่ในไดเรกทอรี. ssh แล้ว ฉันยังได้ลองกับ. ssh / id_rsa แต่ฉันก็ได้ผลลัพธ์เดียวกัน
Pattle

ฉันเข้าใจแล้วฉันเข้าใจผิด - โปรดตอบคำถามจาก @gertvdijk
guntbert

ทุกคนสามารถแสดงความคิดเห็นในstackoverflow.com/questions/51254328/unable-to-ssh-to-bitbucketฉันมีปัญหาที่คล้ายกัน
Mrinmay Kalita

คำตอบ:


90

PubKeyAuthentication

ตั้งค่าลูกค้าของคุณ

  1. สร้างคีย์ของคุณ
    • ssh-keygen
  2. กำหนดค่า ssh เพื่อใช้กุญแจ
    • vim ~/.ssh/config
  3. คัดลอกรหัสของคุณไปยังเซิร์ฟเวอร์ของคุณ
    • ssh-copy-id -i /path/to/key.pub SERVERNAME

ไฟล์กำหนดค่าของคุณจากขั้นตอนที่ 2ควรมีลักษณะคล้ายกับที่แสดงต่อไปนี้

Host SERVERNAME
Hostname ip-or-domain-of-server
User USERNAME
PubKeyAuthentication yes
IdentityFile ./path/to/key

คุณสามารถเพิ่มIdentitiesOnly yesเพื่อให้แน่ใจว่าsshใช้IdentityFileและไม่มี keyfiles อื่น ๆ ในระหว่างการรับรองความถูกต้องซึ่งอาจทำให้เกิดปัญหาและไม่ใช่แนวปฏิบัติที่ดี

การแก้ไขปัญหา

  1. ใช้ตัวเลือก "-vvv"
  2. ตรวจสอบให้แน่ใจว่าเซิร์ฟเวอร์มีรหัสสาธารณะของคุณ (.pub)
  3. ตรวจสอบให้แน่ใจ IdentiyFile ของคุณชี้ไปที่คีย์ของคุณ
  4. ตรวจสอบให้แน่ใจว่า. ssh ไดเรกทอรีของคุณมี 700 และไฟล์ของคุณคือ 700 สิทธิ์ (rwx ------)
  5. tail -f /var/log/auth.log (บนเซิร์ฟเวอร์) และตรวจสอบข้อผิดพลาดเมื่อคุณพยายามเข้าสู่ระบบ
  6. หากคุณมีไฟล์คีย์จำนวนมากพยายามIdentitiesOnly yesจำกัด การรับรองความถูกต้องให้ใช้คีย์เดี่ยวที่ระบุ

1
FYI ฉันสร้างสคริปต์ขนาดเล็กที่github.com/centic9/generate-and-send-ssh-keyซึ่งทำตามขั้นตอนที่จำเป็นในครั้งเดียวและช่วยให้มั่นใจว่าสิทธิ์ของไฟล์ / ไดเรกทอรีทั้งหมดซึ่งทำให้ฉันปวดหัว ...
centic

1
เพียงเพื่ออธิบายขั้นตอนที่ 2: IdentityFileบรรทัดใน ~ / .ssh / config ต้องชี้ไปที่ปุ่ม PRIVATE
Danny Schoemann

จริง
earthmeLon

3
ฉันสงสัยว่าทำไมคุณต้องการตั้งค่าไฟล์ให้มีสิทธิ์ดำเนินการในขั้นตอนที่ 4
ทอดด์วอลตัน

นอกจากนี้ยังเป็นสิทธิ์ที่สำคัญมากต่อผู้ใช้ (ใช้ chown และ chmod) มิฉะนั้นคุณจะได้รับการตรวจสอบสิทธิ์ที่ถูกปฏิเสธแม้ว่าเซิร์ฟเวอร์ของคุณจะมีรหัสสาธารณะของคุณ
joseluisq

61

บางครั้งปัญหามาจากการอนุญาตและความเป็นเจ้าของ ตัวอย่างเช่นหากคุณต้องการเข้าสู่ระบบในฐานะรู/root.sshและauthorized_keysจะต้องเป็นของรูท มิฉะนั้น sshd จะไม่สามารถอ่านได้ดังนั้นจะไม่สามารถบอกได้ว่าผู้ใช้ได้รับอนุญาตให้เข้าสู่ระบบหรือไม่

ในไดเรกทอรีบ้านของคุณ:

chown -R your_user:your_user .ssh

สำหรับสิทธิใช้งานไปกับ 700 สำหรับ.sshและ 600 สำหรับauthorized_keys

chmod 700 .ssh
chmod 600 .ssh/authorized_keys

1
คำตอบนี้ช่วยฉัน ฉันได้รับคำแนะนำจากโพสต์นี้แล้วย้ายauthorized_keysไฟล์ของฉันไปไว้นอกไดเรกทอรีบ้านที่เข้ารหัสของฉัน root:rootในการทำเช่นนั้นฉันมีการเปลี่ยนแปลงโดยไม่ได้ตั้งใจที่จะเป็นเจ้าของ
Jordan Grant

ต้องการฉันสามารถ upvote สองครั้งหนึ่งครั้งสำหรับโฟลเดอร์และอีกครั้งสำหรับไฟล์ สำคัญมากที่การอนุญาตนั้นถูกต้อง
นาย Griever

ใช่มันเป็นสิทธิ์ทั้งหมดมาตลอด
a3y3

หนึ่งนี้แก้ไขปัญหาของฉันขอบคุณสำหรับสิ่งนั้น
sathiyarajan

14

คุณไม่ต้องการauthorized_keysลูกค้าของคุณ

คุณต้องบอกให้ ssh-client ใช้คีย์ที่คุณสร้างขึ้นจริง มีหลายวิธีที่จะทำเช่นนั้น ssh -vvv -i .ssh/id_rsa [youruser]@[yourLinode]เพียงแค่สำหรับประเภทการทดสอบ คุณจะต้องให้ข้อความรหัสผ่านของคุณทุกครั้งที่คุณต้องการเชื่อมต่อกับเซิร์ฟเวอร์

หากใช้งานได้คุณสามารถเพิ่มรหัสลงในssh-agentด้วยssh-add .ssh/id_rsa(คุณจะต้องใส่ข้อความรหัสผ่านเพียงครั้งเดียวสำหรับสิ่งนี้และมันจะทำงานได้ตราบใดที่คุณไม่ออกจากระบบ / รีบูต)


ขอบคุณสำหรับความช่วยเหลือของคุณฉันได้แก้ไขคำตอบของฉันเพื่อแสดงสิ่งที่เกิดขึ้นเมื่อฉันพิมพ์สิ่งที่คุณแนะนำ
Pattle

2
ในการถ่ายโอนคีย์ให้กับลูกค้าใช้ ssh-copy-id
Panther

@ bodhi.zazen ขอบคุณ แต่ฉันได้โอนแล้วที่สำคัญที่ไม่ได้เป็นปัญหาที่เกิดขึ้น
Pattle

4
"คุณต้องบอกให้ ssh-client ใช้คีย์ที่คุณสร้างขึ้นจริง ๆ " ~/.ssh/id_rsaไม่มีโดยปกติแล้วมันจะมองหาที่สำคัญในเส้นทางเริ่มต้นเช่น นอกจากนี้การใช้ตัวแทนกุญแจเป็นทางเลือกที่สมบูรณ์และไม่เกี่ยวข้องกับปัญหาเท่าที่ฉันเห็น
gertvdijk

@ gertvdijk คุณกำลังสร้างข้อสมมติที่นี่ซึ่งยังไม่ได้รับการสนับสนุนจากข้อเท็จจริง - เรายังไม่รู้ว่าเกิดอะไรขึ้นกับระบบ
guntbert

10

นอกจากนี้ยังตรวจสอบค่าของPasswordAuthenticationใน/etc/ssh/sshd_configและถ้ามันเปลี่ยนไปno yesอย่าลืมรีสตาร์ทบริการ ssh หลังจากนั้น


4
OP ไม่พยายามใช้การพิสูจน์ตัวตนด้วยรหัสผ่าน พวกเขามีความรู้สึกบางอย่างและกำลังใช้คีย์สาธารณะ / ส่วนตัว
ctrl-alt-delor

9

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

ssh -i ~/.ssh/private_key username@host

1
ไม่ใช้รหัสสาธารณะ
St3an

@ St3an คุณใส่กุญแจสาธารณะบนเซิร์ฟเวอร์ แต่เมื่อคุณเชื่อมต่ออย่างทอดด์อยู่ที่นี่คุณใช้รหัสส่วนตัวของคุณ
Nathan F.

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

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

7

นอกจากนี้ตรวจสอบให้แน่ใจว่าไดเรกทอรีบ้านของผู้ใช้ (บนเซิร์ฟเวอร์) เป็นของผู้ใช้จริง (ถูกตั้งค่าเป็นรูท: รูทในกรณีของฉัน)

ควรได้รับ:

sudo chown username:username /home/username;

ฉันสามารถใช้คีย์สาธารณะ / ส่วนตัวกับผู้ใช้บนกล่อง linux ในพื้นที่ของฉัน (เช่น abc) แตกต่างจากผู้ใช้บนเซิร์ฟเวอร์ระยะไกล (เช่น def@123.456.789) ฉันต้องตรวจสอบให้แน่ใจว่าผู้ใช้ในท้องถิ่นเป็นเจ้าของไฟล์. ssh ภายในเครื่อง (เช่น abc: abc ไม่ใช่ root: abc) `
Michael

สิ่งนี้ทำงานในกรณีของฉัน
Zerquix18

3

ฉันพบปัญหากับเว็บเซิร์ฟเวอร์เมื่อเร็ว ๆ นี้

~/.ssh/authorized_keys2ฉันมักจะเก็บรายชื่อของผู้มีอำนาจปุ่มบนเซิร์ฟเวอร์ของฉันทั้งหมดใน จากประสบการณ์ของฉันsshdจะมองหา~/.ssh/authorized_keysหรือเป็น~/.ssh/authorized_keys2ค่าเริ่มต้น

ในกรณีของเว็บเซิร์ฟเวอร์ของฉัน/etc/ssh/sshd_configบรรทัดนี้มี

AuthorizedKeysFile    %h/.ssh/authorized_keys

แทน

AuthorizedKeysFile    %h/.ssh/authorized_keys2

ฉันใช้แอพหลังรีสตาร์ท ssh daemon ของฉันและแก้ไขปัญหาการลงชื่อเข้าใช้ด้วย ssh โดยใช้ pubkey ของฉัน


ขอบคุณมากสิ่งนี้ช่วยฉันในการหาว่าบรรทัดนี้ได้รับการคอมเม้นต์จากการตั้งค่าอย่างสมบูรณ์!
Christian.D

2

อีกสาเหตุที่เป็นไปได้อาจจะด้วยการกำหนดค่าในAllowedUsers /etc/ssh/sshd_confหมายเหตุ: รายการเป็นตัวคั่นช่องว่าง (ไม่ใช่เครื่องหมายจุลภาค) ขณะที่ฉันเรียนรู้วิธีที่ยาก

AllowUsers user1 user2 user3

1

หากทุกอย่างล้มเหลวให้ตรวจสอบว่าผู้ใช้เข้าสู่ระบบของคุณเป็นสมาชิก AllowedGroup ของ ssh หรือไม่ นั่นคือผู้ใช้ของคุณเป็นสมาชิกของกลุ่มที่แสดงที่บรรทัดต่อไปนี้ใน/etc/ssh/sshd_configเซิร์ฟเวอร์:

AllowGroups ssh #Here only users of 'ssh' group can login

1

ฉันกรณีของฉันลูกค้าคืออูบุนตู 14.04lts เซิร์ฟเวอร์ชนะเซิร์ฟเวอร์ 2012 ที่ทำงานบน cygwin ฉันใช้ 'ssh administrator @ xxxx' เมื่อไดเรกทอรีเซิร์ฟเวอร์ 2012 ใน cygwin เป็น / home / Administrator ดังนั้นจึงเป็นกรณี ๆ ไปเมื่อฉันลอง 'ssh Administrator @ xxxx' (จดเมืองหลวง A บนผู้ดูแลระบบ) มันก็ใช้ได้ดี

ข้อความแสดงข้อผิดพลาดเช่น 'ผู้ใช้ที่ไม่พบ' จะนำฉันไปสู่การแก้ปัญหาได้เร็วกว่า 'ปฏิเสธการอนุญาต (publickey, keyboard-interactive)'


ใครบางคนควรบันทึกปัญหากับโครงการ ssh ที่แนะนำว่า ฉันพบปัญหาที่คล้ายกัน
Ben Creasy

1

ฉันมีปัญหาเดียวกันเมื่อคัดลอกกุญแจสาธารณะของผู้ใช้ทั่วไป (เช่น johndoe) จากระบบ cPanel Centos ไปยังเซิร์ฟเวอร์ Ubuntu บน AWS ที่แนะนำโดยgertvdijkข้างต้นผมตรวจสอบและนั่นเองก็กล่าวว่า/var/log/auth.log Authentication refused: bad ownership or modes for directory /home/johndoeปรากฎว่าฉันผิด 777'ed /home/johndoeเมื่อพยายามตั้งค่า/home/johndoe/public_htmlเป็นรูทโฮสต์เอกสารเสมือนเริ่มต้นสำหรับ apache2 (ไม่จำเป็นสำหรับงานนั้น)

ดูคำตอบที่นี่และที่นี่

เซิร์ฟเวอร์จะต้องมีพับลิกคีย์.ssh/authorized_keysและไคลเอ็นต์ (คอมพิวเตอร์ที่คุณกำลังทำงาน) ต้องมีไพรเวตคีย์ (.pem หรือหากใช้ SFTP กับ Filezilla, .ppk)


1

สำหรับผู้ใช้ที่โป๊วอย่างฉันที่มาที่หัวข้อนี้คุณอาจได้รับข้อผิดพลาดนี้หากคุณลืมที่จะเพิ่มผู้ใช้ @ Ip!

บุคคลอื่นได้รับอนุญาตบนไฟล์กุญแจ chmod ถึง 600)

ssh 1.1.1.1 -i /path/to/.pem file 
Permission denied (publickey).`

ssh user@1.1.1.1 -i /path/to/.pem file 

1

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

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

sudo nano /etc/ssh/sshd_config

แทนที่สิ่งนี้

UsePAM yes
IgnoreUserKnownHosts no
PasswordAuthentication no

ด้วยสิ่งนี้

UsePAM no
IgnoreUserKnownHosts no
PasswordAuthentication yes

บันทึกไฟล์และรีสตาร์ท ssh

reload ssh

ssh ควรทำงานตอนนี้ขอรหัสผ่าน


1

ฉันมีปัญหาเช่นเดียวกับที่อธิบายไว้ในคำถาม เอาต์พุตจากการดำเนินการssh -vvv -i id_rsa [youruser]@[yourLinode]บนเครื่องไคลเอ็นต์นั้นคล้ายกับที่อธิบายไว้ในคำถาม ฉันตรวจสอบการอนุญาตของไฟล์และไดเรกทอรีทั้งหมดตามคำแนะนำในคำตอบอื่น ๆ และถูกต้อง

มันกลับกลายเป็นว่าเมื่อการคัดลอกไฟล์ที่สร้างid_rsa.pubไปยังเครื่องเซิร์ฟเวอร์เป็นไฟล์~username/.ssh/authorized_keys, ฉันตั้งใจละเว้นคำว่าssh-rsaจากจุดเริ่มต้น การเพิ่มมันแก้ปัญหาได้


1

ทำงานบน Ubuntu 16.04 เช่นกัน

ปัญหานี้อยู่ในsshd_configไฟล์

นี่คือทางออกที่ดีที่สุด:

บันทึกเป็นรูทถึงเซิร์ฟเวอร์ Ubuntu ของคุณ

vi /etc/ssh/sshd_config

ตอนนี้ไปที่ด้านล่างสุดแล้วเปลี่ยนค่าจาก "ไม่" เป็น "ใช่"

ควรมีลักษณะเช่นนี้:

เปลี่ยนเป็นไม่ใช่เพื่อปิดการใช้งานรหัสผ่านข้อความธรรมดา

PasswordAuthentication yes
service sshd reload

เพื่อให้มีผล

ตอนนี้คุณสามารถใช้กุญแจเพียงคำสั่งต่อไปนี้จากเครื่อง LOCAL ของคุณ (แล็ปท็อปหรือที่รู้จัก)

ดังนั้นเปิดหน้าต่างเทอร์มินัลใหม่และอย่าล็อกอินเข้าสู่เซิร์ฟเวอร์เพียงแค่ใส่คำสั่งนี้:

ssh-copy-id john @ serverIPAddress

(แทนที่ john ด้วยชื่อผู้ใช้ของคุณ)

คุณควรจะไป


1

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

ssh root@your-ip-address

rsync --archive --chown=[user]:[user] ~/.ssh /home/[user]

logout

จากนั้นลองอีกครั้ง แทนที่ [ผู้ใช้] ด้วยบัญชีผู้ใช้ใหม่ของคุณ

นี่เป็นเรื่องปกติเมื่อตั้งค่าเซิร์ฟเวอร์ใหม่ใน DigitalOcean เมื่อคุณใช้ ssh-keys ในการตั้งค่า

https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-18-04


0

ในกรณีของฉันปัญหาเกิดจากการคัดลอกไปยัง.sshไดเรกทอรีจากเครื่องรุ่นเก่า ปรากฎว่าการกำหนดค่า SSH เก่าของฉันถูกใช้ปุ่ม DSA ซึ่งได้รับตั้งแต่เลิก เปลี่ยนเป็นคู่คีย์ใหม่คราวนี้ใช้ RSA แก้ปัญหาให้ฉันได้


0

วิธีการต่อไปนี้อาจใช้งานได้หากคุณสามารถเข้าถึง machineA และ machineB ได้อย่างอิสระ (เช่นจาก machineC)

หาก ssh-copy-id ไม่ทำงานการตรวจสอบรหัสผ่านอาจถูกปิดใช้งาน ต่อไปนี้เป็นวิธีแก้ปัญหา

การมีรหัสสาธารณะของ machineA ในคีย์ที่ได้รับอนุญาตของ machineB (เช่น ~ / .ssh / authorized_keys) จะช่วยให้คุณสามารถ ssh จาก machineA นอกจากนี้ยังใช้กับ scp

หลังจากสร้างคู่คีย์โดยใช้: ssh-keygen

บนmachineAดำเนินการcat ~/.ssh/id_rsa.pub

ตัวอย่างผลลัพธ์:

ssh-rsa AAAAB3NzaSGMFZW7yB anask@mahineA

คัดลอกคีย์พิมพ์ ( ⌘ Command+ CหรือCRTL+ C) แล้วเพิ่มไปยัง ~ / .ssh / authorized_keys ไฟล์บนmachineB

ตัวอย่างเช่นรันสิ่งต่อไปนี้บนmachineB :

echo 'ssh-rsa AAAAB3NzaSGMFZW7yB anask@mahineA' >> ~/.ssh/authorized_keys

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