วิธีการขัดขวางไม่ให้รูทสคริปต์ทำงาน


10

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

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

ใช้ Bash shell

[*]: ฉันพยายามแก้ไขสิทธิ์ในไฟล์ แต่ถึงแม้ว่าฉันจะติดตามไฟล์จำนวนมากที่รูทเป็นเจ้าของและ chmod พวกเขาแอปพลิเคชันพบข้อผิดพลาดแปลก ๆ และฉันต้องทำงานเป็นรูทอีกครั้ง

คำตอบ:


18

คล้ายกับคำตอบอื่น ๆ แต่ไปในทิศทางที่คุณต้องการ

if [[ $EUID -eq 0 ]]; then
  echo "This script must NOT be run as root" 1>&2
  exit 1
fi

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

#!/bin/bash

if [ $1 == "start" ]; then
  sudo -u nobody /usr/bin/glassfish
fi

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


2

@Tepepang มีความคิดที่ถูกต้อง ฉันไม่รู้ว่าตัวไหนพกพาได้มากที่สุด แต่นี่เป็นวิธีอื่นในการตรวจสอบว่าผู้ใช้รูท:

id -u
$UID

หรือคุณสามารถบังคับให้มันทำงานในฐานะผู้ใช้รายอื่นด้วยพารามิเตอร์เดียวกันได้:

if [[ "$USER" != appuser ]]
then
    exec sudo -u appuser "$0" "$@"
fi

1
นี่คือย้อนหลัง เขาต้องการให้รูทไม่สามารถเรียกใช้สคริปต์นี้ได้
บาฮามาต

โอ๊ะลืมเรื่องsudoนี้ไปหน่อย ตอนนี้มันควรจะทำงาน
l0b0

@TobySpeight ไม่สคริปต์ไม่ทำอะไรเลยหากผู้ใช้เป็น root ตามที่ต้องการ ฉันเชื่อว่าการเปลี่ยนแปลงของคุณส่งผลให้มีข้อโต้แย้งเพิ่มเติมหาก$@ว่างเปล่าและฉันได้เปลี่ยนแปลงให้ใช้รูปแบบที่พบที่อื่น
l0b0

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

ฉันจะเถียงว่ามันเป็น fork fork เพราะแต่ละอินสแตนซ์จะแยกเชลล์ใหม่สำหรับsudo(มันไม่ได้ใช้exec) และพาเรนต์จะรอมันดังนั้นในที่สุดคุณก็จะจบลงด้วยตารางกระบวนการที่สมบูรณ์ ยังคงมีมูลค่าการใส่execในนั้น (ถ้าคุณไม่ได้ตั้งใจรหัสหลังจากที่fiจะทำงานในฐานะผู้ใช้ที่ไม่ถูกต้อง)
Toby Speight
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.