shell script: ใช้ sudo ข้างในแล้ว vs รันด้วย sudo?


13

เมื่อเขียนเชลล์สคริปซึ่งบางคำสั่ง แต่ไม่ใช่ทั้งหมดนั้นจำเป็นต้องมีสิทธิ์ผู้ใช้ขั้นสูง

  • เพิ่ม sudo ไปยังคำสั่งที่ต้องการสิทธิ์ผู้ใช้ขั้นสูงและรันเชลล์สคริปต์โดยไม่ต้อง sudo หรือ

  • ไม่ต้องเพิ่ม sudo ไปยังคำสั่งที่ต้องการสิทธิ์ผู้ใช้ระดับสูง แต่รันเชลล์สคริปต์ด้วย sudo ใช่ไหม

ในวิธีที่สองฉันจะต้องให้รหัสผ่านของฉันเพียงครั้งเดียว แต่คำสั่งทั้งหมดในสคริปต์จะทำงานด้วยสิทธิพิเศษ superuser รวมถึงคำสั่งที่ไม่ต้องการ

ในวิธีแรกฉันอาจต้องให้รหัสผ่านของฉันหลายครั้งสำหรับคำสั่ง sudo ที่แตกต่างกันในขณะที่สิทธิ์ superuser จะได้รับเฉพาะกับคำสั่งที่ต้องการ

จากความกังวลด้านความปลอดภัยวิธีแรกดีกว่า เพื่อความสะดวกวิธีที่สองดีกว่า

  1. ฉันคิดว่าจะใช้วิธีแรก ดังนั้นฉันต้องจัดการกับความไม่สะดวกในการให้รหัสผ่านกับคำสั่ง sudo หลายคำในเชลล์สคริปต์

  2. Stephen Harris เขียนว่า :

    สคริปต์ที่เขียนได้ดีจะตรวจพบว่ามันทำงานด้วยสิทธิ์ที่ถูกต้องและไม่เรียก sudo เลย แต่มีสคริปต์ที่ไม่ดีมากมาย

    ดังนั้นฉันควรใช้วิธีที่สอง? ถ้าเป็นเช่นนั้น

    • ฉันจะเขียน "สคริปต์จะตรวจพบว่ามันทำงานด้วยสิทธิ์ที่ถูกต้องและไม่เรียก sudo เลย"?

    • ฉันจะปรับปรุงความปลอดภัยเพื่อหลีกเลี่ยงปัญหาในการให้สิทธิ์ผู้ใช้ขั้นสูงสำหรับคำสั่งที่ไม่ต้องการเมื่อใช้งานสคริปต์ด้วย sudo ได้อย่างไร

  3. วิธีการแบบง่ายนี้มีวิธีที่ดีที่สุดทั้งสองวิธีหรือไม่: เพิ่ม sudo ไปยังคำสั่งที่ต้องการใช้และรันสคริปต์โดยมีหรือไม่มี sudo ขึ้นอยู่กับว่าฉันต้องการความสะดวกหรือความปลอดภัยหรือไม่? วิธีนี้มีปัญหาบ้างไหม?

ขอบคุณ


ฉันคิดว่าsudoมีแคชข้อมูลรับรองเริ่มต้น สิ่งนี้ถูกปิดการใช้งานบนแพลตฟอร์มของคุณหรือไม่
ท่อ

@pipe สคริปต์ของเขาอาจกำลังทำงานอยู่เป็นระยะเวลานานและวิธีการที่แคชอาจไม่ทำงาน
LinuxSecurityFreak

คำตอบ:


15

วิธีแก้ไขปัญหาแรกของคุณ:

ฉันจะเขียน "สคริปต์จะตรวจพบว่ามันทำงานด้วยสิทธิ์ที่ถูกต้องและไม่เรียก sudo เลย"?

มีการตรวจสอบที่ง่ายและ POSIX สำหรับรูท:

#!/bin/sh
is_user_root ()
{
    [ "$(id -u)" -eq 0 ]
}

อีกวิธีหนึ่งใน Bash ตัวแปลงสัญญาณที่ขับเคลื่อนด้วยประสิทธิภาพมากขึ้นอาจต้องการใช้:

#!/bin/bash
is_user_root ()
{
    [ ${EUID:-$(id -u)} -eq 0 ]
}

โปรดทราบว่าฉันตั้งใจห่อโค้ดในฟังก์ชั่นเพื่อนำกลับมาใช้ใหม่

วิธีแก้ไขปัญหาที่สองของคุณ:

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

คุณไม่สามารถทำอะไรได้มากกับเรื่องนี้ อย่างน้อยก็ไม่มีอะไรมาอยู่ในใจของฉัน ถ้าฉันเห็นสคริปต์ฉันอาจมีข้อเสนอแนะ แต่เนื่องจากคุณไม่ได้รวมไว้ในคำถามของคุณ ... หากคุณเรียกใช้สคริปต์ทั้งหมดด้วยsudoหรือเป็นrootฉันไม่เห็นวิธีที่จะควบคุมสิ่งนี้

เพื่อแสดงความคิดเห็น:

คุณคิดอย่างไรกับ "ใช้ sudo ข้างในกับ vs เรียกใช้ด้วย sudo"

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


sudo -u "$SUDO_USER" command...?
Michael Homer

ขอบคุณ คุณคิดอย่างไรกับ "ใช้ sudo ข้างในกับ vs เรียกใช้ด้วย sudo"?
ทิม

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

@MichaelHomer ฉันสงสัยว่าsudo -u "$SUDO_USER" commandควรจะหมายถึงอะไรที่นี่?
ทิม

@Tim แม้ว่าฉันจะไม่พบปัญหาใด ๆ กับวิธีการที่บางคนอาจโต้แย้งด้วยเหตุผลที่เหมาะสม นี่ไม่ใช่ขอบเขตของคำถามดั้งเดิมของคุณ ฉันต้องทำการสำรองข้อมูล M-Disc รายเดือนของฉันตอนนี้ดังนั้นฉันจึงคิดว่าจะยังไม่สามารถใช้งานได้ในวันนี้ขอโทษที่ทำเช่นนั้น ฉันหวังว่าฉันจะตอบประเด็นหลักอย่างน้อย เจอกันพรุ่งนี้.
LinuxSecurityFreak

-4

ฉันคิดว่าฉันสามารถตอบคำถามนี้

ดังนั้นฉันควรใช้วิธีที่สอง?

ไม่มีเหตุผลว่าทำไมคุณควรมีปัญหาที่นี่นี่คือเหตุผล:

หากมีคำสั่งเดียวเท่านั้นที่จำเป็นต้องเรียกใช้ในฐานะรูทแสดงว่าrunโปรแกรมของคุณในrootหรือsudoเพราะsudoในสคริปต์ของคุณคือถนนอีกต่อไป คุณลืมไปแล้วหรือว่าโปรแกรมเมอร์ขี้เกียจ?

หากคุณต้องการคำสั่งจำนวนมากrunเป็นrootทำงานแล้วมันเป็นหรือrootsudo

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

หากผู้ใช้รายอื่นต้องการrunโปรแกรมของคุณให้ตั้งค่าsudoสำหรับผู้ใช้เหล่านั้นเพราะsudoสามารถปรับแต่งได้มากมายและจะตอบสนองความต้องการของคุณ

นี่คือตัวอย่างของsudo:

ใช้เสมอvisudoเมื่อแก้ไขไฟล์ sudoers .....

kate ALL=(ALL) NOPASSWD: /usr/local/bin/script ARG1 ARG2

sudo นอกจากนี้ยังยอดเยี่ยมสำหรับการเปลี่ยนผู้ใช้ภายในโปรแกรม / สคริปต์ของคุณที่นี่เป็นบรรทัดจากสคริปต์ของฉัน:

sudo -i -u "$user" user="$user" CURRENTDIR="$CURRENTDIR" BASHRC="$BASHRC" bash <<'EOF'

ฉันจะเขียน "สคริปต์จะตรวจพบว่ามันทำงานด้วยสิทธิ์ที่ถูกต้องและไม่เรียก sudo เลย"?

https://www.cyberciti.biz/tips/shell-root-user-check-script.html
how-do-i-find-if-a-shell-script-is-running-with-root-permission

bash/sh:

#!/bin/bash
# (Use #!/bin/sh for sh)
if [ `id -u` = 0 ] 
then
        echo "I AM ROOT, HEAR ME ROAR"
fi

csh:

#!/bin/csh
if ( `id -u` == "0" ) 
then
        echo "I AM ROOT, HEAR ME ROAR"
endif

#!/bin/bash
if [[ $EUID -ne 0 ]]; then
  echo "You must be a root user" 2>&1
  exit 1
else
  mount /dev/sdb1 /mnt/disk2
fi

แก้ไขโดยการร้องขอจากสุภาพบุรุษ @terdon:

คิดว่าสคริปต์ของคุณด้วยวิธีนี้ ....

มันเป็นสคริปต์สาธารณะ (คนอื่น ๆ ที่คุณจะใช้งาน) สคริปต์นี้ทำหน้าที่อะไร? มันบอกเวลาหรือไม่? หรือมันปรับปรุง iptables ในระบบ 200? ถ้าเพียงคุณใช้มันจะทำงาน / มืออาชีพที่เกี่ยวข้องหรือเพื่อการใช้งานส่วนตัว?

คุณเพียงแค่ต้องรู้ล่วงหน้าว่ากลุ่มผู้ใช้ของคุณประกอบด้วยอะไร

ถ้ามันเป็นwrittenจะให้หรือขายเพื่อให้ผู้ดูแลระบบได้แล้วทำไมไม่ควรscriptได้รับอนุญาตให้ทำงานเป็นroot?? สิ่งที่เป็นอันตรายสามารถทำ?

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

หากคุณcode needs rootใช้sudoและหากมีหลายคนก็ใช้เป็นroot....... คำตอบของฉันจะสิ้นสุดที่นี่วุ้ย


2
@somethingSomething คุณสามารถอธิบายได้ว่าทำไมคุณจึงแนะนำให้เรียกใช้สคริปต์ในฐานะ root เสมอแม้ว่าจะมีเพียงคำสั่งเดียวที่ต้องการสิทธิ์รูทก็ตาม คุณให้ความเป็นไปได้สองอย่างในคำตอบของคุณ (คำสั่งเดียวที่ต้องการสิทธิ์รูทหรือหลายอย่าง) แต่คุณแนะนำสิ่งเดียวกันสำหรับทั้งคู่
terdon

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