เมื่อ Ubuntu ขอรหัสผ่านผู้ใช้ของผู้ดูแลระบบจะตัดสินใจได้อย่างไรว่าผู้ใช้ระดับผู้ดูแลระบบรายใดจะขอ


11

ฉันกำลังตั้งค่าเครื่อง Ubuntu (10.10) ที่หลายคนจะใช้งาน เป็นเครื่องที่ใช้ร่วมกันในสำนักงานขนาดเล็ก บทบาทหลักคือการโฮสต์เครื่องเสมือนด้วย VirtualBox และให้บริการไฟล์ด้วย Samba

สำหรับแซมบ้าจำเป็นต้องตั้งค่าบัญชีผู้ใช้หลายบัญชีเพื่อให้ผู้ใช้หลายคนสามารถเชื่อมต่อกับแชร์แซมบ้าได้จากเวิร์กสเตชันของตนเอง อย่างไรก็ตามยังมีบัญชีที่ใช้เฉพาะกับเครื่องเสมือนที่ใช้งานได้หลายคน บางครั้งผู้คนพยายามทำสิ่งต่าง ๆ กับบัญชีนี้ซึ่งต้องการสิทธิ์ในการยกระดับสูงซึ่งทำให้กล่องโต้ตอบ "โปรดป้อนรหัสผ่านของผู้ใช้ที่เป็นผู้ดูแลระบบ" ของ Gnome จะปรากฏขึ้น อย่างไรก็ตามไดอะล็อกนี้จะขอรหัสผ่านของฉัน - เมื่อฉันตั้งค่าเครื่อง Mine เป็นบัญชีแรกที่สร้างขึ้นดังนั้นจึงดูเหมือนว่าฉันเป็นผู้ใช้เพียงคนเดียวที่ได้รับสิทธิ์ sudo

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

เพื่อสรุป:

  • บัญชีในเครื่อง: Alice, Bob, Carol, Dave, Eliza
  • เมื่อติดตั้ง Ubuntu แล้ว Alice เป็นผู้ใช้รายแรกซึ่งถูกเพิ่มระหว่างกระบวนการติดตั้ง
  • "เดฟ" เป็นบัญชีที่หลายคนใช้ซึ่งไม่สามารถอยู่ได้/etc/sudoersเพราะรหัสผ่านเป็นความรู้สาธารณะ
  • Bob ได้รับการกำหนดให้เป็นบัญชี "การดูแลระบบ" ใน Gnome และมีการป้อนข้อมูลอย่างเหมาะสม/etc/sudoers- Bob เป็นหัวหน้าที่สำนักงานนี้
  • เมื่อมีการพยายามดำเนินการที่ต้องการสิทธิ์ยกระดับในขณะที่ลงชื่อเข้าใช้ในชื่อ Bob, Carol, Eliza หรือ Dave ระบบควรขอข้อมูลประจำตัวของ Bob
  • เมื่อมีการพยายามดำเนินการที่ต้องการสิทธิ์ยกระดับในขณะที่ลงชื่อเข้าใช้ในฐานะอลิซระบบควรขอข้อมูลประจำตัวของอลิซ (แม้ว่าอลิซจะเป็นผู้ดูแลระบบของ buckaroo และมีนิสัยชอบใช้su -งานผู้ดูแลระบบเพิ่มเติม)

ฉันต้องเปลี่ยนแปลงการกำหนดค่าใดบ้างเพื่อให้เกิดสถานะที่ต้องการที่นี่


ทางเลือกอื่นคืออนุญาตให้คำสั่งที่เกี่ยวข้องกับการจำลองเสมือนใช้สิทธิ์ของผู้ดูแลระบบโดยอัตโนมัติ ฉันแน่ใจว่าฉันอ่านคำถามเกี่ยวกับเรื่องนี้ แต่ฉันลืม
Oxwivi

Googling ฉบับย่อบอกฉันว่าคุณทำได้จากsudoersไฟล์เดียวกันคุณสามารถตรวจสอบmanpageเพื่อดูข้อมูลเพิ่มเติม
Oxwivi

ฉันคิดว่าเมื่อฉันแก้ไขsudoers: มันไม่ใช่ทางเลือกแรกเนื่องจากปัญหาด้านความปลอดภัย ดูคำตอบของ enzotib - ส่วนหนึ่งของปัญหาคือความสับสนระหว่างsudoและ PolicyKit
Brighid McDonnell

คำตอบ:


9

ก่อนอื่นให้ชี้ให้เห็นว่าการกระทำที่ได้รับอนุญาตได้รับอนุญาตสำหรับผู้ใช้ที่ไม่ใช่รูทผ่านกลไกที่แตกต่างกันสองแบบ

  1. sudo

  2. PolicyKit

คำสั่งแรกจะถูกใช้เมื่อคุณเรียกใช้คำสั่งด้วยsudoหรือรายการเมนูที่คำสั่งถูกห่อด้วยgksu(เช่นSynaptic Package Manager )
ในกรณีนี้รหัสผ่านที่จำเป็นต้องเป็นของผู้ใช้ที่เรียกใช้โดยปกติผู้ใช้ที่เข้าสู่ระบบ

อันที่สองถูกใช้เมื่อแอปพลิเคชัน PolicyKit ตระหนักถึงความพยายามที่จะดำเนินการสิทธิพิเศษ ในกรณีเช่นนี้แอปพลิเคชันจะถาม PolicyKit Local Authority (ผ่าน D-Bus) ว่าสามารถดำเนินการได้หรือไม่ หน่วยงานท้องถิ่นผ่านตัวแทนการรับรองความถูกต้องขอให้ผู้ใช้ที่ใช้งานเพื่อพิสูจน์ตัวตน หน้าต่างข้อความดังต่อไปนี้ (น่าเสียดายที่มีข้อความเป็นภาษาอิตาลี :)

ป้อนคำอธิบายรูปภาพที่นี่

คุณสามารถระบุ PolicyKit จากสามเหลี่ยมสีดำเล็ก ๆ น้อย ๆ และฉลากรายละเอียด อย่างที่คุณเห็นหากมีผู้ใช้มากกว่าหนึ่งรายในadminกลุ่มคุณสามารถเลือกจากรายการที่ผู้ใช้จะใช้สำหรับการตรวจสอบสิทธิ์

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

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

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


1
ฉันรู้สึกว่าฉันเข้าใจสถานการณ์ได้ดีขึ้นมาก ขอขอบคุณ.
Brighid McDonnell

6

เห็นได้ชัดว่าsudoจะเป็นตัวเลือกแรกสำหรับฉันในกรณีเช่นนี้ จุดสำคัญที่ดูเหมือนจะเป็นว่าส่วนใหญ่ (จริง) ผู้ดูแลระบบไม่ได้ใช้งานจริง/etc/sudoersเท่าที่เป็นไปได้อย่างเต็มที่ ( User_Alias, Runas_Alias, Host_Alias, Cmnd_Alias)

ผู้ดูแลระบบส่วนใหญ่จะใช้เพียงบางส่วนของกฎที่มีอยู่และเพิ่มผู้ใช้หรือแย่กว่านั้นเพียงเพิ่มผู้ใช้ไปยังsudoกลุ่มที่มักจะมีกฎอยู่ในการตั้งค่า Ubuntu ( %sudo... ) แน่นอนว่าสิ่งนี้จะช่วยให้ผู้ใช้แต่ละคนสามารถครอบครองได้อย่างอิสระและเต็มพลังของบัญชี superuser

รับความคิดเห็นของคุณ:

ดังนั้นฉันจึงเพิ่มพวกเขาไป /etc/sudoers

ฉันคิดว่าคุณไม่ได้ใช้มันเท่าที่จะเป็นไปได้

ในสถานการณ์เช่นของคุณฉันจะเขียนสคริปต์การกระทำบางอย่างที่บ๊อบจะถูก จำกัด ในความเป็นจริงนี่คือสิ่งที่ฉันทำบนเซิร์ฟเวอร์ที่ฉันดูแลเพื่ออนุญาตให้ผู้ใช้สองคนทำการรีบูตผู้เยี่ยมชม KVM เฉพาะบนโฮสต์ สคริปต์จะมี hashbang พร้อมพา ธ สัมบูรณ์ไปยังล่าม (เช่น#!/bin/dashแทน#!/usr/bin/env bash) และอาจทำงานด้วยเชลล์ที่ใช้ที่อื่นสำหรับงานที่มีสิทธิพิเศษ ( /bin/dashหรือ/bin/sh) นี่เป็นเพียงข้อควรระวัง นอกจากนั้นฉันจะทำให้แน่ใจว่า hardcode เส้นทางสัมบูรณ์ทั้งหมดไปยังไบนารีและใช้น้อยที่สุดเท่าที่จะทำได้ เช่นเมื่อใช้bash/ dashฉันจะชอบbuiltinมากกว่าcommand(ดูman bash) คุณสามารถทำให้การบำรุงรักษานี้โดยการกำหนดตัวแปรเส้นทางที่แน่นอนและอ้างอิงถึงโปรแกรมตามตัวแปรนั้น ($VIRSHแทน/usr/bin/virsh) หากทำได้ให้ตรวจสอบรหัสของสคริปต์ภายนอกก่อนเรียกใช้ โดยเฉพาะอย่างยิ่งถ้าคุณต้องการเรียกพวกเขาในบริบทพิเศษ ในกรณีของฉันฉันยัง จำกัด ผู้ใช้ไปยังไดเรกทอรีรากเฉพาะและระบบย่อย SSH เฉพาะเพราะพวกเขาเชื่อมต่อกับเครื่องผ่านsshdการตรวจสอบและรหัสสาธารณะ เห็นได้ชัดว่าคุณไม่ต้องการสิ่งนั้น

ตรวจสอบให้แน่ใจเพื่อchown root: <the-script>; chmod u=rw,a=,a+rx <the-script>ป้องกันทุกคน แต่rootเหมาะสมจากการแก้ไขด้วย ระวังด้วยsetuidและsetgidเปิดใช้งานบิตบนไบนารีเป้าหมาย ( findสามารถใช้เพื่อตรวจสอบได้) สมมติว่าสคริปต์ของคุณอยู่ใน/usr/sbin/priv-actionขณะนี้

/etc/sudoersตอนนี้แก้ไข noexecสามารถใช้เพื่อป้องกันไบนารีอื่น ๆ นอกเหนือจากที่ได้รับอนุญาตอย่างชัดเจนเช่นกัน จริงๆแล้วมีการตั้งค่าเพิ่มเติมมากมายไม่ใช่เฉพาะที่ฉันกำลังอธิบายที่นี่ man sudoersเพื่อให้แน่ใจว่าจะให้คำปรึกษา

ตอนนี้ฉันต้องการตั้งชื่อผู้ใช้ ( User_Alias) ในsudoersไฟล์ของฉันแต่คุณสามารถใช้Group_Alias( man sudoers) หรือกลุ่มระบบจริง (เช่น%sudo):

# The list is comma-separated: bob,alice,...
User_Alias      LIMITED_ADMINS=bob

จากนั้นเพิ่มนามแฝงคำสั่งเพื่ออนุญาตให้เรียกใช้งานสคริปต์เฉพาะนั้น:

# The list is comma-separated: /usr/sbin/priv-action,/bin/bash,...
Cmnd_Alias      PRIV_ACTION=/usr/sbin/priv-action

สิ่งสุดท้ายที่ต้องทำก็คือสายเวทย์มนตร์ที่จะอนุญาตให้bob(หรือมากกว่าผู้ใช้ที่อยู่ในรายการLIMITED_ADMINS) ดำเนินการคำสั่งพิเศษผ่านสคริปต์:

LIMITED_ADMINS  ALL=(root) PRIV_ACTION

ไม่เหมือนกับคำจำกัดความของนามแฝงก่อนหน้านี้ที่บรรทัดต้องการคำอธิบาย งั้นลองขุดลงไปในส่วนต่าง ๆ ในบรรทัด "ข้อมูลจำเพาะของผู้ใช้" ที่นี่man sudoersช่วย:

who where = (as_whom) whatโครงสร้างพื้นฐานของสเปคใช้เป็น

บรรทัดตัวอย่าง (พบในการตั้งค่า Ubuntu ส่วนใหญ่):

root    ALL=(ALL) ALL

สิ่งนี้บอกว่าผู้ใช้ชื่อ root (ใช้#0เพื่อเชื่อมโยงกับ UID 0) ในโฮสต์ทั้งหมดอาจเรียกใช้ภายใต้บริบทของผู้ใช้ แต่จะถามรหัสผ่านของเขา (สมมติว่ามีพฤติกรรมเริ่มต้น) การเพิ่มNOPASSWDแท็กก่อนที่สุดท้ายALLก็จะยังอนุญาตให้rootทำเช่นเดียวกันโดยไม่ต้องถูกถามรหัสผ่าน (เช่นดังนั้น: root ALL=(ALL) NOPASSWD:ALL) ALLเป็นนามแฝงตัวแทนที่แท้จริงสำหรับประเภทนามแฝงต่างๆ

แต่กลับไปที่บ็อบ:

LIMITED_ADMINS  ALL=(root) PRIV_ACTION

จะช่วยให้bobสมาชิกและจดทะเบียนอื่น ๆ ของUser_Alias LIMITED_ADMINSการเรียกใช้ (บนโฮสต์ทั้งหมดที่ว่าอะไรALLเป็น) เป็นผู้ใช้root(กลุ่มโดยนัย แต่จะได้รับดูman sudoers) Cmnd_Alias PRIV_ACTIONคำสั่งที่กำหนดใน มันจะดีขึ้น ยังคงสมมติว่าคุณเขียนสคริปต์นี้คุณสามารถอนุญาตให้พารามิเตอร์ต่าง ๆ ดังนั้นจึงหลีกเลี่ยงการเขียนสคริปต์หลาย ๆ /etc/sudoersยินดีใช้สัญลักษณ์แทนเชลล์เพื่อจำกัดความเป็นไปได้ของข้อโต้แย้งที่อนุญาตให้ส่งผ่าน

ฉันพบว่าผู้ดูแลระบบไม่ได้ใช้sudoersวิธีที่ควรใช้ซึ่งเป็นเหตุผลว่าทำไมฉันจึงชอบ "แฮ็ค" จากหนังสือสองเล่ม "Linux Server Hacks" และ "Linux Server Hacks Volume Two" ซึ่งทำให้ฉันเริ่มต้นด้วย การใช้สิ่งอำนวยความสะดวกที่ยอดเยี่ยมนี้มีความซับซ้อนยิ่งขึ้น

คุณสามารถสร้างความสับสนทุกประเภท - ซึ่งอาจไม่ช่วยด้านความปลอดภัย - โซลูชั่นสำหรับกรณีของคุณโดยเฉพาะ แต่เมื่อคุณพูดคำศัพท์พื้นฐานของ/etc/sudoersคุณสามารถทำได้ค่อนข้างดี :)

หมายเหตุ: โปรดทราบว่าคุณยังสามารถสร้างไฟล์ใหม่ภายใต้/etc/sudoers.d/หากคุณรู้สึกอยาก สิ่งนี้จะถือว่าคุณ/etc/sudoersมีบรรทัด:

#includedir /etc/sudoers.d

-1

มีผู้ใช้ระดับสูงเพียงคนเดียวใน Unix / Linux ชื่อของมันคือรูท แต่ sudoers เป็นผู้ใช้ที่สามารถกลายเป็นรูตได้ คุณควรใช้กลุ่ม:

newgrp admins

จากนั้นกำหนดผู้ใช้ให้กับกลุ่มนั้น:

chgrp alice admins

จากนั้นเพิ่มกลุ่มผู้ดูแลระบบลงในไฟล์กำหนดค่า sudoers เช่นถ้ากลุ่มเป็นผู้ใช้

ปรับปรุง

หรือคุณสามารถเพิ่มผู้ใช้ในกลุ่มผู้ดูแลระบบ:

chgrp alice admin

ขออภัยฉันกดปุ่มแท็บและส่งโดยไม่เสร็จสิ้น
Francisco Valdez

Zorched ความคิดเห็นตามคำตอบที่ไม่สมบูรณ์ ลองคำตอบปัจจุบัน สมมติว่างานนิทรรศการพิเศษสำหรับผู้อ่านในอนาคตอาจจะไม่ค่อยคุ้นเคยกับงานระบบดูแลระบบ
Brighid McDonnell

แน่นอนฉันไม่ได้ตั้งใจจะอวดดีมีเว็บไซต์แลกเปลี่ยนเกี่ยวกับการดูแลระบบ
Francisco Valdez

ฉันรู้ว่า ServerFault มีอยู่จริง ฉันถามที่นี่เพราะนี่เป็นพฤติกรรมเฉพาะของ Ubuntu
Brighid McDonnell

AFAIK: adduser <user>, addgroup <group>และadduser <user> <group>เป็นวิธีที่แนะนำใน Debian / Ubuntu
0xC0000022L
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.