권한이없는 사용자로 시작 작업 실행


142

시작 작업이 사용자 ID를 변경하고 권한이없는 사용자로 스크립트를 실행하는 정식 방법은 무엇입니까?

분명히 su또는 을 사용할 수 sudo있지만 해키처럼 보일 수 있습니다 (그리고 불필요한 로그 라인을 생성 할 수 있음).

답변:


108

upstart v1.4에서는 setuidsetgid 가 기본적으로 구성 파일에서 지원됩니다.


7
이에 대한 세부 사항에 대한 요리 책을 참조하십시오 upstart.ubuntu.com/cookbook/#run-a-job-as-a-different-user
제이슨 Navarrete은

10
즉, Precise (12.04) 이상에서 지원됩니다.
Edward Anderson

8
즉, centos 6에서 지원되지 않습니다
소켓 쌍

5
기록 initctl --version을 위해 현재 버전의 시작 버전을 찾으십시오.
Mahn

4
귀찮게 AWS의 Amazon Linux 배포판은 RHEL 6의 시작 버전 (0.6.5 !!!!)을 사용하므로이를 사용하는 사람은 누구나 'su'솔루션을 사용해야합니다.
Asfand Qazi

86

프리 노드에서 #upstart 채널을 물어 보면 공식적으로 다음과 같은 문제가 발생합니다.

Upstart의 향후 릴리스는이를 기본적으로 지원하지만 현재로서는 다음과 같은 것을 사용할 수 있습니다.

exec su -s /bin/sh -c 'exec "$0" "$@"' username -- /path/to/command [parameters...]

7
이것은 Amazon Linue EC2에서 작동 한 유일한 답변입니다 (--session-command, -c, ad nauseum을 포함한 모든 sudo 및 su 변형을 시도했습니다). 그들 중 어느 것도 시작된 후에 프로세스가 중단되는 것을 허용하지 않았다. 정말 감사합니다.
Kato

멋진 쉘 마법, +1입니다.
Steve Kehlet

6
CentOS 6 (Upstart 0.6.5)에서는 작동하지 않았습니다. 그에 의해 시작된 일련의 포크 (4 깊이) 는 최종 PID를 잡을 수 없다는 su것을 의미합니다 . expect forkexpect daemon
Mark Lakata

2
나는 이것을 Amazon Linux (Upstart 0.6.5)에서 Jenkins 프로세스를 부팅하기 위해 사용했습니다 (감사합니다). 표준 출력을 로그 파일로 리디렉션하고 일부 환경 변수를 설정하기 위해 조금 변경해야했지만 제대로 작동했습니다! 내 버전은 다음과 같습니다 :exec su -s /bin/sh -c 'HOME=/foo/bar exec "$0" "$@" &>/var/log/foobar.log' username -- /path/to/command [parameters...]
Asfand Qazi

17

start-stop-daemon은 어떻습니까?

exec start-stop-daemon --start --chuid daemonuser --exec /bin/server_cmd

에서 갑자기 출세 한 요리 책 :

데비안 및 우분투 시스템에 권장되는 방법은 도우미 유틸리티를 사용하는 것 start-stop-daemon입니다. […] start-stop-daemon는 PAM ( "Pluggable Authentication Module") 제한을 시작 프로세스에 적용하지 않습니다.

참고 : start-stop-daemonRHEL에서는 지원되지 않습니다.


2
필요한 경우 그룹을 사용할 수도 있습니다. --chuid daemonuser : daemongroup 사용
Evgeny

13

여러 가지 의미론, 특히 그룹 멤버쉽과 관련된 의미가 다른 여러 가지 방법이 있습니다.

  • setuidgid 지정한 그룹에 넣습니다.

    • 원래의 daemontools ' setuidgid는 해당 그룹 에만 사용자를 배치 하므로 회원 인 다른 그룹에 속하는 파일에 액세스 할 수 없습니다.
    • setuidgid데몬 툴즈 - 앙코르에서setuidgid요기 도구 세트에서 둘 모두가 -s(일명 --supplementary의 모두 해당 그룹에 투입하고, 또한 넣을 것) 옵션을 추가 그룹 사용자가 지정하는 사용자를.
  • 사용 newgrp이되고 나면 덜 권한이있는 사용자는 그룹 셋에 하나의 그룹을 추가 할뿐만 아니라, 스크립트 내에서 사용하기가 까다로운하고, 새로운 서브 쉘을 생성합니다.

  • start-stop-daemon 그룹 멤버십을 유지하고 setuid / setgid 이상의 기능을 수행합니다.

  • chpst -u username:group1:group2:group3... commandname어떤 그룹 멤버쉽을 채택할지 정확히 지정할 수 있지만 ( 우분투에서는 ) runit패키지 와 함께 제공 됩니다 upstart.

  • su -c commandname username는 사용자 이름의 모든 그룹 멤버쉽을 선택합니다 sudo -u username commandname. 따라서 가장 놀라운 방법 일 것입니다.



4

Amazon EC2의 Ubuntu 10.10 인스턴스에서이 start-stop-daemon명령을 사용하는 것이 좋습니다 .

나는 또한 다른 스타트 업 스탠자 들과 싸웠다 . virtualenv실행 된 프로그램에 특정 매개 변수가 있는 파이썬 응용 프로그램을 호출하고 있습니다.

다음은 나를 위해 일한 것입니다.

script
  export PYTHONPATH=.:/home/ubuntu/.local/lib/python2.7/site-packages/:/home/ubuntu/python/lib/python2.7/site-packages/
  exec start-stop-daemon --start  --chuid ubuntu --exec /home/ubuntu/python_envs/MyProj/bin/python /home/ubuntu/www/MyProj/MyProj.py -- --config-file-dir=/home/ubuntu/www/MyProj/config/ >> /home/ubuntu/startup.log 2>&1 &
end script

PYTHONPATH에 소스에서 설치 한 일부 패키지를 얻는 것입니다 파이썬 이 신출내기 작업이 실행될 때 모듈 경로. chdir스탠자는 작동하지 않는 것처럼 보였으 므로 모든 것을 절대 경로 로 수행해야했습니다.


또한 exec start-stop-daemon 과 함께 사용되는 env 변수에 문제가 있습니다 .
토마스 브라 트

3

CentOS 6을 사용하고 있었고, 권장되는 핵 (Upstart 0.6.5의 경우)이 작동하지 않으며 관련된 포크 수 (4는 생각)가 'expect fork '또는'예상 데몬 '.

나는 결국 막했다

chown user:group executable
chmod +s executable

(즉 setuid 비트를 설정하고 소유권을 변경하십시오).

가장 안전한 방법은 아니지만 내부 R & D 프로젝트의 경우에는 문제가되지 않습니다.


그냥 대신 chmod 1700에 적어도 하나 이상의 작업을 수행했다면 "충분히 안전"한 것으로 간주됩니다. :)chmod u+sx,go-x+s
dannysauer

0

달성하려는 목표에 따라 세 번째 가능성이 있습니다. 해당 파일 / 장치의 액세스 제어 수 있습니다 . 이를 통해 권한이없는 사용자는 일반적으로 허용되지 않는 항목을 마운트하거나 액세스 할 수 있습니다. 그 과정에서 왕국에 열쇠를주지 말아야합니다.

sudo 비밀번호 캐시의 제한 시간을 변경할 수도 있습니다 . 그러나 귀하의 컴퓨터가 물리적으로 안전하지 않으면 권장하지 않습니다 (예를 들어, 통행인이 sudo 액세스를 시도 할 가능성이 없다고 생각합니다).

권한이 작업을 수행 할 수있는 매우 몇 가지 방법이 있다는 것을 그들이 수행하는 것이 좋은 이유가 없이 필요한 로깅. 느슨한 제한은 시스템의 보안 위험이 될 수 있으며 로깅이 부족하면 손상되었을 때 어떤 일이 발생했는지 알 수있는 방법이 없습니다.

로그 파일 의 크기 가 문제가되면 문제가있을 수 있습니다. Sudo는 정상적인 조건에서 사용 당 하나의 라인 만 생성합니다.


0

CentOS 6, upstart 0.6.5에서 다음은 저에게 효과적입니다.

script

    exec su user_name << EOF
        exec /path/to/command [parameters...]
EOF

end script

또는 :

script

    exec su user_name << EOF
       ..... what you want to do ....
EOF

end script

사용시

exec su -s /bin/sh -c 'exec "$0" "$@"' username -- /path/to/command [parameters...]

에 의해 작업 프로세스를 중지 할 수 없습니다 initclt stop. 그 이유는 다음과 같습니다.

1. the job forked and the main process is not tracked.
2. the main process changed its process group,because of `su -c`
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.