루트가 스크립트를 실행하지 못하게하는 방법


10

글래스 피시 응용 프로그램 서버는 응용 프로그램 서버를 관리하고 또한 시작을 중지하고 나는이 스크립트를 실행 루트 사용자를 제한하고자하는 스크립트를 제공합니다. 그 이유는 일부 주요 개발자가 서버를 권한이없는 사용자로 관리하는 것을 잊고 응용 프로그램 서버를 루트 사용자로 다시 시작하면 응용 프로그램 서버가 루트 사용자 [*]에 의해 실행되어야하기 때문입니다.

루트 액세스를 피하는 옵션이 아니며 개발자는 로컬 컴퓨터에서이를 수행하는 데 익숙하기 때문에 잊어 버립니다. asadmin스크립트가 권한이없는 사용자로 실행되도록 변경하거나 스크립트가 루트로 실행될 때마다 오류 메시지를 표시하도록 선택하고 싶습니다 .

배쉬 쉘이 사용됩니다.

[*] : 파일에 대한 권한을 수정하려고했지만 루트가 소유하고 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

@Tshepang은 올바른 아이디어를 가지고 있습니다. 어느 것이 가장 이식 가능한지 모르겠지만 사용자가 루트인지 여부를 감지하는 다른 방법이 있습니다.

id -u
$UID

또는 동일한 매개 변수를 사용하여 다른 사용자로 강제 실행하도록 할 수 있습니다.

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

1
이것은 뒤로입니다. 그는 루트 가이 스크립트를 실행 하지 않기를 원합니다 .
bahamat

D' oh, sudo조금 잊어 버렸습니다 . 이제 작업을 수행해야합니다.
l0b0

@TobySpeight 아니요, 스크립트는 사용자가 의도 한대로 루트 인 경우 아무 작업도 수행하지 않습니다 . $@비어 있으면 변경 사항으로 인해 추가 인수가 발생한다고 생각하며 다른 곳에서 찾은 패턴을 사용하도록 변경했습니다.
l0b0

@TobySpeight에게 감사드립니다. 나는 제로 인수가 올바르게 전달되도록하는 방법으로 어딘가에서 그 형식을 보았을 것이라고 확신했습니다. 또한 버그를 가지고있는 수표를
고쳤

각 인스턴스가 sudo(사용하지 않음 exec)에 대해 새로운 쉘을 포크 하고 부모가 대기하기 때문에 포크 폭탄이라고 주장했습니다 . 따라서 결국 전체 프로세스 테이블로 끝납니다. 여전히 잘못된 사용자로 실행 exec한 후 코드를 의도하지 않으면 거기에 넣을 가치가 fi있습니다.
Toby Speight
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.