วิธีการทำให้ Shared Keys .ssh / authorized_keys และ sudo ทำงานร่วมกันได้อย่างไร


15

ฉันได้ตั้งค่า. ssh / authorized_keys และสามารถเข้าสู่ระบบด้วย "ผู้ใช้" ใหม่โดยใช้ pub / private key ... ฉันได้เพิ่ม "user" ไปยังรายการ sudoers ... ปัญหาที่ฉันมีตอนนี้คือเมื่อ ฉันพยายามรันคำสั่ง sudo ง่าย ๆ เช่น:

$ sudo cd /root

มันจะทำให้ฉันใส่รหัสผ่านที่ฉันป้อน แต่ใช้ไม่ได้ (ฉันใช้รหัสผ่านส่วนตัวที่ฉันตั้งไว้)

นอกจากนี้ฉันได้ปิดใช้งานรหัสผ่านของผู้ใช้โดยใช้

$ passwd -l user

ฉันพลาดอะไรไป

ข้อสังเกตเบื้องต้นของฉันถูกเข้าใจผิด ...

ฉันกำลังพยายามที่จะทำให้ระบบของฉันแข็งขึ้น ... เป้าหมายสูงสุดคือการใช้ pub / private keys ในการเข้าสู่ระบบเทียบกับการพิสูจน์ตัวตนด้วยรหัสผ่านแบบง่าย ฉันพบวิธีการตั้งค่าทั้งหมดนั้นผ่านไฟล์ authorized_keys

นอกจากนี้ฉันจะป้องกันการล็อกอินเซิร์ฟเวอร์ในที่สุดผ่านบัญชีรูท แต่ก่อนที่ฉันจะทำฉันต้องใช้ sudo เพื่อทำงานกับผู้ใช้คนที่สอง (ผู้ใช้ที่ฉันจะเข้าสู่ระบบตลอดเวลา)

สำหรับผู้ใช้ที่สองนี้ฉันต้องการป้องกันการเข้าสู่ระบบด้วยรหัสผ่านปกติและบังคับให้ลงชื่อเข้าใช้แบบผับ / ส่วนตัวเท่านั้นหากฉันไม่ล็อกผู้ใช้ผ่าน "ผู้ใช้ passwd -l ... จากนั้นถ้าฉันไม่ได้ใช้กุญแจ เข้าสู่เซิร์ฟเวอร์ด้วยรหัสผ่านปกติ

แต่ที่สำคัญฉันต้องใช้ sudo เพื่อทำงานกับการตั้งค่าคีย์ / ผับ / ส่วนตัวกับผู้ใช้ที่ปิดใช้งานรหัสผ่านของเขา / เธอ


แก้ไข:ตกลงฉันคิดว่าฉันได้รับแล้ว (วิธีแก้ไข):

1) ฉันได้ปรับ / etc / ssh / sshd_config แล้วตั้งค่าPasswordAuthentication no สิ่งนี้จะป้องกันการลงชื่อเข้าใช้รหัสผ่าน ssh (ต้องแน่ใจว่ามีการตั้งค่าคีย์สาธารณะ / ส่วนตัวที่ใช้งานได้ก่อนที่จะทำสิ่งนี้

2) ฉันได้ปรับรายการ sudoers visudoและเพิ่ม

root      ALL=(ALL) ALL
dimas     ALL=(ALL) NOPASSWD: ALL

3) root เป็นบัญชีผู้ใช้เดียวที่จะมีรหัสผ่านฉันกำลังทดสอบกับสองบัญชีผู้ใช้ "dimas" และ "sherry" ซึ่งไม่มีชุดรหัสผ่าน (รหัสผ่านว่างเปล่าpasswd -d user)

ข้างต้นเป็นหลักป้องกันไม่ให้ทุกคนเข้าสู่ระบบด้วยรหัสผ่าน (รหัสสาธารณะ / ส่วนตัวจะต้องตั้งค่า)

นอกจากนี้ผู้ใช้ในรายการ sudoers มีความสามารถของผู้ดูแลระบบ พวกเขายังสามารถsuไปยังบัญชีที่แตกต่างกัน ดังนั้นโดยทั่วไป "ดิมัส" สามารถsudo su sherryแต่ "ดิมัสไม่สามารถทำsu sherry. ในทำนองเดียวกันผู้ใช้ใด ๆ ไม่ได้อยู่ในรายการ sudoers ไม่สามารถทำหรือsu usersudo su user

หมายเหตุการทำงานด้านบน แต่ถือว่ามีความปลอดภัยต่ำ สคริปต์ใด ๆ ที่สามารถเข้าถึงรหัสในฐานะผู้ใช้ "dimas" หรือ "sherry" จะสามารถเรียกใช้ sudo เพื่อเข้าถึงรูทได้ ข้อผิดพลาดใน ssh ที่อนุญาตให้ผู้ใช้ระยะไกลเข้าสู่ระบบแม้จะมีการตั้งค่าการเรียกใช้รหัสระยะไกลในบางสิ่งเช่น Firefox หรือข้อบกพร่องอื่น ๆ ที่อนุญาตให้เรียกใช้รหัสที่ไม่พึงประสงค์ได้ Sudo ควรใช้รหัสผ่านเสมอมิฉะนั้นคุณอาจเข้าสู่ระบบในฐานะ root แทนผู้ใช้รายอื่น

คำตอบ:


10

sshและsudoไม่มีอะไรเกี่ยวข้องกัน การตั้งค่าsshวิธีการรับรองความถูกต้องจะไม่ทำอะไรsudoเลย sudoจะไม่เข้าใจsshรหัสผ่าน

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

ผมคิดว่าสิ่งที่คุณต้องการเป็นNOPASSWDตัวเลือกในของคุณsudoersไฟล์

(PS ไม่มีเหตุผลที่จะเรียกใช้cdคำสั่งด้วยsudo. cdไม่เผยแพร่ไปยังกระบวนการหลักดังนั้นทันทีที่sudoออกคุณจะกลับมาที่ที่คุณเริ่มต้น)

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


ตกลง แต่ความจริงที่ว่าผู้ใช้ไม่มีรหัสผ่าน: ผู้ใช้ passwd -l ... ทำให้คำสั่ง sudo ไม่ทำงาน?
farinspace

@farinspace ใช่ฉันเข้าใจคำถามดีขึ้นและขยายความคิดเห็นของฉันอย่างมีนัยสำคัญ passwd -lลบรหัสผ่านในแง่ที่ว่าบัญชีถูกล็อค - ซึ่งก็คือรหัสผ่านจะไม่ทำงาน คุณต้องการปิดการตรวจสอบรหัสผ่านใน sudo
ร่วมงาน

ตรรกะนี้เป็นอย่างไร: การปิดรหัสผ่านในไฟล์ sudoers จะยังคงปลอดภัยเนื่องจากระบบได้รับการชุบแข็งผ่านการเข้าสู่ระบบ pub / private key ... และอีกครั้งผู้ดูแลระบบเท่านั้นที่จะสามารถเพิ่มผู้ใช้ไปยังรายการ sudoers
Farinspace

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

4
@coneslayer คำตอบนี้ไม่ถูกต้อง 100% ดังที่คุณเห็นด้านล่างคุณสามารถกำหนดค่า sudo เพื่อเคารพการรับรองความถูกต้องของ ssh ได้
Andre de Miranda

18

สิ่งที่คุณต้องการจะทำคือไปได้ แต่มันจะต้องใช้ประสบการณ์บางอย่างที่คุณจะต้องรวบรวมโมดูล PAM ที่เรียกว่าPam-ตัวแทน ssh-รับรองความถูกต้อง

กระบวนการนี้ง่ายพอสมควร:

$ sudo aptitude install libssl-dev libpam0g-dev build-essential checkinstall
$ wget "http://downloads.sourceforge.net/project/pamsshagentauth/pam_ssh_agent_auth/v0.9.3/pam_ssh_agent_auth-0.9.3.tar.bz2"
$ tar -xjvf pam_ssh_agent_auth-0.9.3.tar.bz2
$ cd pam_ssh_agent_auth-0.9.3

$ ./configure --libexecdir=/lib/security --with-mantype=man

$ make
$ sudo checkinstall

แก้ไขการกำหนดค่า sudo:

$ sudo visudo

เพิ่มรายการต่อไปนี้:

Defaults env_keep += SSH_AUTH_SOCK

ดำเนินการต่อโดยเปลี่ยนการตั้งค่า sudo PAM:

$ sudo vi /etc/pam.d/sudo

เพิ่ม (เหนือบรรทัด @include):

**auth [success=2 default=ignore] pam_ssh_agent_auth.so file=~/.ssh/authorized_keys**
@include common-auth
@include common-account

ตัวเลือกอื่นสามารถพบได้ในhttp://serverfault.com/questions/61796/easy-multi-level-authentication-for-sudo/303452#303452
Andre de Miranda

4
นี่ควรเป็นคำตอบที่ได้รับการยอมรับ
Christopher Monsanto

1
คำแนะนำเหล่านี้ (โดยเฉพาะ/etc/pam.d/sudoคำแนะนำ) ล้าสมัยสำหรับ Ubuntu รุ่นปัจจุบัน ฉันได้ให้คำแนะนำที่ปรับปรุงแล้วในคำตอบของฉัน
Chris Pick

4

คำตอบของ Andre de Miranda เป็นคำตอบที่ดีโดยใช้pam_ssh_agent_authแต่ชิ้นส่วนล้าสมัย /etc/pam.d/sudoคำแนะนำโดยเฉพาะอย่างยิ่งเมื่อใช้ Linux หลายเวอร์ชันในปัจจุบัน

หากคุณกำลังใช้อูบุนตู 12.04 แม่นยำฉันได้ง่ายจริงกระบวนการโดยการให้ pam_ssh_agent_auth สร้างจาก ppa A: ppa: cpick / Pam-ตัวแทน ssh-รับรองความถูกต้อง

คุณสามารถติดตั้งแพคเกจโดยการเรียกใช้:

sudo add-apt-repository ppa:cpick/pam-ssh-agent-auth
sudo apt-get install pam-ssh-agent-auth

หลังจากการติดตั้งหากคุณต้องการใช้โมดูล PAM นี้ด้วย sudo คุณจะต้องกำหนดการตั้งค่าของ sudo และการกำหนดค่า PAM ใน Ubuntu 12.04 ที่แม่นยำคุณสามารถทำได้โดยสร้างสองไฟล์ต่อไปนี้:

/etc/sudoers.d/pam-ssh-agent-auth:

Defaults    env_keep+="SSH_AUTH_SOCK"

/etc/pam.d/sudo:

ent#%PAM-1.0

auth       required   pam_env.so readenv=1 user_readenv=0
auth       required   pam_env.so readenv=1 envfile=/etc/default/locale user_readenv=0
auth       sufficient pam_ssh_agent_auth.so file=/etc/security/authorized_keys
@include common-auth
@include common-account
@include common-session-noninteractive

หากคุณใช้เชฟกระบวนการข้างต้นสามารถเป็นอัตโนมัติกับตำราอาหารของฉันพบได้ที่หนึ่งในสองแห่งต่อไปนี้:
https://github.com/cpick/pam-ssh-agent-auth
http: //community.opscode .com

filesไดเรกทอรีของตำราอาหารประกอบด้วย/etc/pam.d/sudoและ/etc/sudoers.d/pam-ssh-agent-authไฟล์ที่อธิบายไว้ข้างต้นซึ่งทำงานกับ Ubuntu 12.04 อย่างแม่นยำและควรเป็นจุดเริ่มต้นที่เป็นประโยชน์เมื่อใช้เวอร์ชัน / distros อื่น ๆ


-1

วิธีเดียวที่ฉันรู้ว่าการเลี่ยงผ่านการป้อนรหัสผ่านคือการปิดใช้งานในsudoersไฟล์ของคุณ

สิ่งนี้จะให้rootและสมาชิกทุกคนของwheel การเข้าถึงแบบเต็มโดยไม่มีรหัสผ่าน:

root    ALL=(ALL)   NOPASSWD: ALL
%wheel  ALL=(ALL)   NOPASSWD: ALL

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


ฉันไม่สนใจการใช้รหัสผ่านปัญหาที่ดูเหมือนคือหลังจากที่ฉันปิดการใช้รหัสผ่านของผู้ใช้ผ่าน: ผู้ใช้ passwd -l ... ฉันยังคงสามารถเข้าสู่ระบบผ่านทางผับ / คีย์ส่วนตัว (รหัสส่วนตัวมีรหัสผ่านที่ปลอดภัย) เมื่อฉันทำ sudo จะขอรหัสผ่าน แต่นี่ไม่ใช่รหัสผ่านจากคีย์ส่วนตัวที่ดูเหมือนว่ารหัสผ่านนี้ตั้งอยู่ที่ไหนถ้า ive ปิดการใช้งานมันสำหรับผู้ใช้ (ฉันอยากจะพยายามหลีกเลี่ยงการบำรุงรักษารหัสผ่านบนระบบ sss และ บนคีย์ส่วนตัว)
farinspace

"รหัสผ่านนี้ถูกตั้งไว้ที่ไหนถ้า ive ปิดใช้งานสำหรับผู้ใช้" ไม่มีที่ไหนเลย ไม่มีรหัสผ่านที่คุณสามารถพิมพ์ได้ว่าจะใช้งานได้เพราะคุณล็อคบัญชี
coneslayer

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