bash 스크립트가 루트로 실행되도록 허용하지만 sudo는 허용하지 않음

bash 스크립트가 루트로 실행되도록 허용하지만 sudo는 허용하지 않음

저는 여기에 처음이고 bash/linux를 처음 접했습니다.

선생님은 sudo를 사용할 때가 아니라 "실제" 루트일 때만 스크립트가 실행되도록 하는 과제를 주셨습니다. 두 시간 동안 검색하고 노력한 후에 나는 그가 바람을 피우고 있다고 생각하기 시작했습니다. 루트만 허용하면 쉬운데 sudo로 실행하는 사용자는 어떻게 제외하나요?

이것이 내가 가진 것입니다:

if [[ $EUID -ne 0 ]]; then
  echo "You must be root to run this script."
  exit
fi

답변1

내가 생각할 수 있는 유일한 방법은 SUDO_*sudo가 설정한 환경 변수 중 하나를 확인하는 것입니다.

#!/usr/bin/env sh

if [ "$(id -u)" -eq 0 ]
then
    if [ -n "$SUDO_USER" ]
    then
        printf "This script has to run as root (not sudo)\n" >&2
        exit 1
    fi
    printf "OK, script run as root (not sudo)\n"
else
    printf "This script has to run as root\n" >&2
    exit 1
fi

물론 이 솔루션은 스크립트를 실행하기 전에 다른 사람이 변수를 설정하는 것을 막을 수 없으므로 미래에도 사용할 수 없습니다.

$ su
Password:
# SUDO_USER=whatever ./root.sh
This script has to run as root (not sudo)
# ./root.sh
OK, script run as root (not sudo)

답변2

또 다른 옵션은 상위 프로세스 이름이 "sudo"인지 확인하는 것입니다.

#!/bin/sh
if [ "$(id -u)" -eq 0 ]
then
  if [ $(ps -o comm= -p $(ps -o ppid= -p $$)) = "sudo" ]
  then
    echo Running under sudo
  else
    echo Running as root and not via sudo
  fi
else
  echo Not running as root
fi

답변3

어떤 사용자가 로그인했는지에 대한 정보는 에서 확인할 수 있습니다 /proc/self/loginuid.편집하다 설명: 이 파일은 모든 시스템에 존재하지 않는 것 같습니다. 테스트한 결과 Centos 6, Fedora 32, Fedora 33 및 Ubuntu 20.04에서 모두 표준 x86_64 설정으로 작동합니다. 사용자로 로그인하여 루트를 사용 sudo하거나 su루트가 되어도 이는 변경되지 않으며 /proc/self/loginuid0이 아닌 값이 됩니다. 루트로 직접 로그인하면 cat /proc/self/loginuid이것이 반환됩니다 0. 이 파일은 루트 사용자라도 수정할 수 없습니다. 편집하다 Stéphane Chazelas의 의견에 감사드립니다. 루트를 사용할 수 있지만 echo 0 > /proc/self/loginuid설정을 통해 이를 방지할 수 있습니다 auditctl --loginuid-immutable.

실제 루트 디렉터리( auditctl --loginuid-immutable설정된 경우)를 확인하는 스크립트는 다음과 같습니다.

#!/bin/bash
loginuid=$(cat /proc/self/loginuid)
echo $loginuid
if [[ $loginuid -ne 0 ]]; then
    echo "You did not log in as root."
    exit
fi

답변4

프로세스 목록 문자열을 확인하고 사용자가 사용하고 있는지 확인하는 것이 좋습니다.sudo

contype=`tty | cut -d '/' -f 3`
tty="$contype/`tty | cut -d '/' -f 4`"

if [ "$(id -u)" -eq 0 ]
then
    res=`ps ax | grep "$tty" | grep "$0" | grep "sudo"`
    if [ $? == 0 ]
    then
        echo "You should not run the script using sudo!"
        exit 2
    else
        echo "Done."
    fi
else
    echo "You are not root. Run this script as root."
    exit 2
fi

res결과를 다시 필터링하고 싶다면 이 변수가 적합합니다.

Arkadusz 코드는 좋지만 안타깝게도 쉽게 우회할 수 있습니다...

관련 정보