ใช้ SSH บนซ็อกเก็ต UNIX แทน sudo เพื่อกำจัดไฟล์ suid

Timothee Ravier จาก Red Hat ผู้ดูแลโครงการ Fedora Silverblue และ Fedora Kinoite เสนอวิธีหลีกเลี่ยงการใช้ยูทิลิตี้ sudo ซึ่งใช้บิต suid เพื่อเพิ่มสิทธิ์ แทนที่จะเป็น sudo สำหรับผู้ใช้ปกติในการรันคำสั่งด้วยสิทธิ์รูท ขอเสนอให้ใช้ยูทิลิตี ssh พร้อมการเชื่อมต่อในเครื่องกับระบบเดียวกันผ่านซ็อกเก็ต UNIX และการตรวจสอบสิทธิ์ตามคีย์ SSH

การใช้ ssh แทน sudo ช่วยให้คุณสามารถกำจัดโปรแกรม suid บนระบบและเปิดใช้งานการดำเนินการคำสั่งพิเศษในสภาพแวดล้อมโฮสต์ของการแจกแจงที่ใช้ส่วนประกอบการแยกคอนเทนเนอร์ เช่น Fedora Silverblue, Fedora Kinoite, Fedora Sericea และ Fedora Onyx หากต้องการจำกัดการเข้าถึง คุณสามารถใช้การยืนยันสิทธิ์โดยใช้โทเค็น USB (เช่น Yubikey) เพิ่มเติมได้

ตัวอย่างการกำหนดค่าส่วนประกอบเซิร์ฟเวอร์ OpenSSH สำหรับการเข้าถึงผ่านซ็อกเก็ต Unix ในเครื่อง (อินสแตนซ์ sshd แยกต่างหากจะเปิดตัวพร้อมกับไฟล์การกำหนดค่าของตัวเอง):

/etc/systemd/system/sshd-unix.socket: [หน่วย] คำอธิบาย=เซิร์ฟเวอร์ OpenSSH เอกสาร Unix Socket =man:sshd(8) man:sshd_config(5) [Socket] ListenStream=/run/sshd.sock ยอมรับ=ใช่ [ติดตั้ง] WantedBy=sockets.target

/ etc / systemd / system /[ป้องกันอีเมล]: [หน่วย] คำอธิบาย=OpenSSH ต่อการเชื่อมต่อ daemon เซิร์ฟเวอร์ (ซ็อกเก็ต Unix) เอกสารประกอบ=man:sshd(8) man:sshd_config(5) Wants=sshd-keygen.target After=sshd-keygen.target [บริการ] ExecStart=- /usr/sbin/sshd -i -f /etc/ssh/sshd_config_unix StandardInput=ซ็อกเก็ต

/etc/ssh/sshd_config_unix: # เหลือเพียงการตรวจสอบคีย์เท่านั้น PermitRootLogin ห้ามใช้รหัสผ่าน PasswordAuthentication no PermitEmptyPasswords ไม่มี GSSAPIAuthentication no # จำกัด การเข้าถึงผู้ใช้ที่เลือก AllowUsers root adminusername # เหลือเฉพาะการใช้ .ssh/authorized_keys (ไม่มี .ssh/authorized_keys2 AuthorizedKeysFile .ssh /authorized_keys # เปิดใช้งานระบบย่อย sftp sftp /usr/libexec/openssh/sftp-server

เปิดใช้งานและเปิดใช้งานหน่วย systemd: sudo systemctl daemon-reload sudo systemctl เปิดใช้งาน — ตอนนี้ sshd-unix.socket

เพิ่มคีย์ SSH ของคุณไปที่ /root/.ssh/authorized_keys

การตั้งค่าไคลเอ็นต์ SSH

ติดตั้งยูทิลิตี้ socat: sudo dnf ติดตั้ง socat

เราเสริม /.ssh/config โดยระบุ socat เป็นพร็อกซีสำหรับการเข้าถึงผ่านซ็อกเก็ต UNIX: Host host.local User root # ใช้ /run/host/run แทน /run เพื่อทำงานจากคอนเทนเนอร์ ProxyCommand socat - UNIX-CLIENT: / run/ host/run/sshd.sock # พาธไปยังคีย์ SSH IdentityFile ~/.ssh/keys/localroot # เปิดใช้งานการสนับสนุน TTY สำหรับเชลล์แบบโต้ตอบ RequestTTY ใช่ # ลบเอาต์พุตที่ไม่จำเป็น LogLevel เงียบ

ในรูปแบบปัจจุบัน ผู้ใช้ ผู้ดูแลระบบ ชื่อผู้ใช้ จะสามารถดำเนินการคำสั่งในฐานะรูทโดยไม่ต้องป้อนรหัสผ่าน กำลังตรวจสอบการดำเนินการ: $ ssh host.local [root ~]#

เราสร้างนามแฝง sudohost ใน bash เพื่อเรียกใช้ “ssh host.local” ซึ่งคล้ายกับ sudo: sudohost() { if [[ ${#} -eq 0 ]]; จากนั้น ssh host.local "cd \"${PWD}\"; exec \"${SHELL}\" --login" อย่างอื่น ssh host.local "cd \"${PWD}\"; ดำเนินการ \»${@}\»» fi }

ตรวจสอบ: $ sudohost id uid=0(root) gid=0(root) groups=0(root)

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

เราตรวจสอบว่าอัลกอริธึมใดบ้างที่ Yubikey ที่มีอยู่รองรับ: lsusb -v 2>/dev/null | grep -A2 ยูบิโก | grep "bcdDevice" | awk '{พิมพ์ $2}'

หากเอาต์พุตเป็น 5.2.3 หรือสูงกว่า ให้ใช้ ed25519-sk เมื่อสร้างคีย์ มิฉะนั้นให้ใช้ ecdsa-sk: ssh-keygen -t ed25519-sk หรือ ssh-keygen -t ecdsa-sk

เพิ่มกุญแจสาธารณะให้กับ /root/.ssh/authorized_keys

เพิ่มการเชื่อมโยงประเภทคีย์เข้ากับการกำหนดค่า sshd: /etc/ssh/sshd_config_unix: PubkeyAcceptedKeyTypes [ป้องกันอีเมล],[ป้องกันอีเมล]

เราจำกัดการเข้าถึงซ็อกเก็ต Unix เฉพาะผู้ใช้ที่สามารถยกระดับสิทธิ์ได้ (ในตัวอย่างของเรา ชื่อผู้ใช้) ใน /etc/systemd/system/sshd-unix.socket เพิ่ม: [Socket] ... SocketUser=adminusername SocketGroup=adminusername SocketMode=0660

ที่มา: opennet.ru

เพิ่มความคิดเห็น