ไม่สามารถสร้างผู้ใช้ด้วยรหัสผ่านทาง ssh [ปิด]


13

ฉันพยายามสร้างผู้ใช้ด้วยรหัสผ่านผ่าน ssh (ด้วยสิทธิ์ root) เช่นนี้:

ssh root@123.45.6.7 useradd -p $(openssl passwd -1 1234) newuser

ด้วยการทำเช่นนั้นฉันสามารถสร้างชื่อบัญชีสำเร็จnewuserแต่ฉันไม่สามารถเข้าสู่ระบบด้วยรหัสผ่านที่คาดไว้ (ซึ่งคือ1234)

มันไม่ต่างอะไรเลยถ้าฉันเพิ่มเครื่องหมายคำพูดคู่:

ssh root@123.45.6.7 "useradd -p $(openssl passwd -1 1234) newuser"

จากนั้นฉันสงสัยว่าฉันสามารถสร้างรหัสผ่านที่แฮชและบันทึกเป็นตัวแปรภายในเครื่องได้หรือไม่ แต่ก็ยังไม่มีโชค

password=$(openssl passwd -1 1234)
ssh root@123.45.6.7 "useradd -p $password newuser"

มีอะไรที่ฉันคิดถึงบ้างไหม? ขอบคุณล่วงหน้า!


การส่งผ่านรหัสผ่านบนบรรทัดคำสั่งเป็นแนวคิดที่ไม่ดีเนื่องจากผู้ใช้รายอื่นอาจเห็นอาร์กิวเมนต์ของบรรทัดคำสั่ง ดูคำตอบของ heemayl สำหรับสิ่งนั้น นอกเหนือจากนั้นเสียงนี้ชอบปัญหา XY คุณพยายามทำอะไรให้สำเร็จ จุดประสงค์ของรหัสผ่านบัญชีที่ไม่มีใครรู้จัก (หรือควรรู้) คืออะไร? หากประเด็นคือการสร้างบัญชีที่ไม่ยอมรับการเข้าสู่ระบบด้วยรหัสผ่านเพียงแค่ตั้งรหัสผ่านที่จะทำให้การเข้าสู่ระบบที่ใช้รหัสผ่านถูกปิดใช้งานเป็นนโยบายเริ่มต้นของ Ubuntu
David Foerster

คำตอบ:


22

นี่เป็นปัญหาการอ้างอิงแบบคลาสสิก

ปัญหา:หากไม่มีการเสนอราคาหรือการอ้างอิงสองครั้งการแทนที่คำสั่ง ( $()) และการขยายตัวแปร ( $s ในรหัสผ่านที่แฮชที่ส่งคืนโดยopensslจะถือว่าเป็นตัวบ่งชี้ตัวแปร) กำลังทำในสภาพแวดล้อมท้องถิ่นไม่ใช่บนรีโมตเชลล์

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

ssh root@123.45.6.7 'useradd -p "$(openssl passwd -1 1234)" newuser'

จดบันทึกใบเสนอราคา

ปัญหาด้านความปลอดภัย:

  • rootควรลงชื่อเข้าใช้SSH หากคุณต้องเปิดใช้งานควรมีการอนุญาตให้ใช้การตรวจสอบความถูกต้องด้วยรหัสเท่านั้น

  • MD5 เสียไปแล้วและหากไม่มีเกลือคุณจะต้องถูกโจมตีจาก Rainbow Table อย่างง่าย (ไม่จำเป็นต้องใช้การโจมตีแบบบังคับเดรัจฉาน / พจนานุกรม) openssl passwdสร้างเกลือสุ่มแม้ว่า อย่างไรก็ตามคุณควรพิจารณาใช้ SHA-2 กับเกลือ

  • รหัสผ่านที่ส่งผ่านเป็นอาร์กิวเมนต์ไปยังคำสั่งอาจปรากฏให้กระบวนการอื่น ๆ ในระบบ (ระยะไกล); ขึ้นอยู่กับวิธีการprocfsติดตั้งของคุณ(ดูที่hidepid) และหากคำสั่งเขียนใหม่เอง (กรณีนี้อาจไม่ได้)


1
ทำงานเหมือนมีเสน่ห์และขอบคุณสำหรับข้อมูลเพิ่มเติม!
amigcamel

1
แฮชรหัสผ่าน md5crypt มีเกลือ ...
ilkkachu

@ilkkachu MD5 ไม่ใช่แฮชที่ปลอดภัย หากคุณสนใจเรียกใช้ค้นหาในความปลอดภัยของข้อมูล จริง ๆ แล้วคุณควรใช้อัลกอริทึมแบบผสมหรือไลบรารีการเข้ารหัสลับ แต่ SHA-2 นั้นดีกว่า MD5 อย่างมาก
wizzwizz4

1
@ wizzwizz4 ใช่เป็นที่รู้จักกันดีไม่ได้เปลี่ยนความจริงที่ว่าข้อมูลในคำตอบนี้ไม่ถูกต้อง :)
ฮอบส์

2
@ wizzwizz4 แฮชรหัสผ่าน ( md5crypt ) ที่สนับสนุนโดยcrypt(3)Linux และทำเครื่องหมายด้วย$1$ตัวระบุไม่เหมือนกับอัลกอริทึมแฮช MD5 ธรรมดาในแบบเดียวกับที่แฮช$5$และ$6$ รหัสผ่านไม่ใช่ SHA-256 และ SHA-512 ธรรมดา . วิธีการที่ใช้ MD5 นั้นมีการวนซ้ำที่แน่นอนซึ่งเป็นปัญหาที่ใหญ่ที่สุด
ilkkachu

7

ดังที่ @heemayl ตั้งข้อสังเกตอัลกอริธึมการแฮ็นรหัสผ่าน MD5 นั้นเก่าและระบบปัจจุบันจะใช้แฮชรหัสผ่าน SHA-2 ที่ใหม่กว่าซึ่งมีปัจจัยการทำงานที่ปรับแต่งได้ แต่เครื่องมือบรรทัดคำสั่ง OpenSSL ดูเหมือนจะไม่สนับสนุนสิ่งเหล่านั้น

อย่างไรก็ตามchpasswdยูทิลิตีนี้จะอนุญาตให้คุณเปลี่ยนรหัสผ่านของผู้ใช้ตามการตั้งค่าระบบ

สิ่งนี้จะช่วยให้คุณสามารถสร้างผู้ใช้ใหม่และเปลี่ยนรหัสผ่านของผู้ใช้บนรีโมทปลายทาง

echo "newuser:newpass" | ssh root@123.45.6.7 'useradd newuser; chpasswd' 

chpasswdใช้ชื่อผู้ใช้และรหัสผ่านจาก stdin ไม่ใช่บรรทัดคำสั่ง นี่เป็นข้อได้เปรียบจริง ๆ เนื่องจากอาร์กิวเมนต์บรรทัดคำสั่งสามารถมองเห็นได้สำหรับกระบวนการอื่น ๆ ทั้งหมดในระบบดังนั้นหากเรียกใช้openssl passwdบนรีโมตรหัสผ่านจะสามารถมองเห็นได้ในทุกกระบวนการในระบบ

ฉันไม่แน่ใจว่ามียูทิลิตีบรรทัดคำสั่งสำเร็จรูปสำหรับการสร้างแฮชรหัสผ่านที่crypt(3)ฟังก์ชันระบบรู้จักหรือไม่ Perl มีcryptฟังก์ชั่น builtin แต่เกลือที่เหมาะสมก็ยังต้องถูกสร้างขึ้น

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