서버의 사용자가 리소스가 부족한 명령을 실행해야 한다고 가정합니다. 전달된 매개변수를 구문 분석하고 해당 명령이 특정 조건이나 시간에서만 사용되도록 보장하는 래퍼 스크립트로 해당 명령을 래핑하고 싶습니다.
문제는 프로그램 자체가 실행 가능하지 않으면 래퍼도 이를 실행할 수 없다는 것입니다. 또한 명령이 루트로 실행되지 않기를 원합니다.
가능합니까?
답변1
간단한 대답은 다음과 같습니다.그건 말도 안 돼힘사용자는 래퍼 스크립트를 사용합니다.
그 이유는 간단합니다.설명했다프로그램. 이는 bash
(또는 다른 쉘 프로세스가) 다음을 수행해야 함 을 의미합니다.읽다파일 내에서 호출된 명령을 실행하기 위해 파일을 엽니다.
이는 래퍼 스크립트를 실행할 권한이 있는 사용자가 래퍼 스크립트에서 수행되는 모든 작업을 수행할 권한이 있어야 함을 의미합니다. 대부분의 경우*, 쉘 스크립트(내부 논리와 조건문이 많은 경우에도)는 명령 프롬프트에 전체 스크립트를 한 줄씩 입력할 때와 정확히 동일한 작업을 수행합니다.
교육을 받지 못한 사용자가 시스템 속도를 늦추는 것을 어렵게 만들고 싶다면 여러 가지 방법이 있습니다., @mikeserv가 귀하의 질문에 대한 댓글에서 제안한 내용과 같은 것입니다. 나는 당장에 최소한 5가지 접근 방식을 생각할 수 있는데, 그 중 다수를 결합할 수 있는 방법을 이해하는 열쇠는 다음과 같습니다.그들은 안전하지 않다. 그들은 실제로 그렇지 않습니다예방하다사용자는 래퍼 스크립트 대신 명령을 직접 사용하며 사용자가 자신의 래퍼 스크립트 복사본을 만들고(완전히 실행하려면 읽기 권한이 있어야 함) 원하는 방식으로 수정하는 것을 방지할 수 없습니다(또한 할 수 없습니다). 좋아한다.
그것예바이너리 실행 파일로 컴파일한 다음 해당 C 프로그램을 SUID***로 만드는 래퍼 스크립트의 기능을 수행하는 짧은 C 프로그램을 작성하는 것이 가능합니다. 이것이 사용자가 논의 중인 명령을 실행할 수 있는 유일한 방법입니다. 이것은 내 범위와 전문 지식을 넘어서는 것입니다.
다른 옵션에는 하루 중 특정 시간에만 명령을 실행할 수 있는 권한을 허용하도록 cronjob을 설정하여 sudoers 파일을 수정하는 것과 같은 매우 이상한 해결 방법(해킹)이 포함됩니다. 그러나 이는 매우 이상하고 나쁜 아이디어의 영역에 들어갑니다.
나는 이 작업을 수행하는 표준 방법이 있다고 생각합니다.힘기술적으로 능숙한 사용자의 경우 래퍼 스크립트는 다음과 같습니다.
(제한 명령은 이라고 가정합니다 date
.)
- 스크립트에서 해당 호출이
date
절대 경로를 사용하는지 확인하십시오. (/bin/date
실행하여 이것이 무엇인지 알 수 있습니다which date
.) 또한 스크립트에 올바른 shebang이 있는지 확인하여 입력하지 않고도 실행할 수 있고 다음bash ./myscript
과 같이 실행 가능./myscript
하고 보장됩니다. 모든 사람이 읽고 실행할 수 있도록 합니다. (chmod 555 myscript
) - 래퍼 스크립트를 넣고
/usr/local/bin/
이름을date
. - 사용자가 이미
/usr/local/bin
로그인 되어 있는지 확인하세요.시작그들의$PATH
변수. (사용자로 로그인하고 실행하면 됩니다echo "$PATH"
.) 기본적으로 이미 이 기능이 있어야 합니다. 이전 경로에 있었던 한/bin
(또는 원래 명령의 위치가 무엇date
이든) 맨 처음에 있을 필요는 없습니다.
해당 경로에 없으면 다음을 실행하여 추가할 수 있습니다.echo 'PATH="/usr/local/bin:$PATH"' | sudo tee /etc/profile.d/my_path_prefix.sh
이제 사용자가 명령을 직접 실행하려고 할 때마다 래퍼 스크립트가 있는 디렉터리가 자신의 $PATH
.
보다 해커 스타일의 "검은 모자" 솔루션은 사용자 경로 앞에 다른 버전을 배치하는 것이 아니라 원래 명령 자체와 동일한 위치에 래퍼 스크립트를 배치하여 원래 바이너리를 실제로 마스크하는 것입니다. 자신의 책임 하에 사용하세요:
- 아무도 명령을 경로에 포함하지 않도록 명령 자체를
bin
일반 디렉토리 외부에 배치하십시오. 예를 들어, 로 옮길 수 있습니다/var/local
. (더 좋은 곳이 있을 수도 있지만 이미 해킹된 것이므로 별 문제가 되지 않습니까?) date
래퍼 스크립트에 대한 호출이 다음을 가리키는지 확인하세요.새로운date
절대 경로의 위치:/var/local/date
제 예에서는요.- 래퍼 스크립트를
date
이전 위치인 으로 이동하고date
원래 이름을 사용합니다.
주요 주의사항은매번누구나시스템 초기화 스크립트를 포함하여 명령을 실행해 보면 래퍼 스크립트가 표시됩니다.
이것은 순전히 해킹이며 규정을 준수하지 않습니다.좋아요시스템 관리. 하지만 그것은예그것은 가능하며, 당신은 그것이 가능하다는 것을 알고 있습니다. 더 나은 해결책은 위에 게시한 것입니다.
*예외는 스크립트에서 실행할 때와 대화식으로 실행할 때 다르게 동작하는 환경 및 프로그램 수정과 관련됩니다. 이러한 이상 현상은 다음과 관련이 있습니다.권한그러나 이는 따라서 이 논의와 관련이 없습니다.
**관심 있으신 분들은 댓글로 질문해 주시면 자세히 설명드리겠습니다.
*** suid 루트가 아닙니다. 이렇게 하려면 사용자를 생성하고, 당신이 말하는 명령( chmod 010
또는 무엇이든)을 실행할 권한이 있는 유일한 그룹인 그룹에 넣은 다음 chown
새로 컴파일된 래퍼 바이너리를 사용자가 소유한 그룹에 할당하고 로 suid 비트를 설정합니다 chmod 4511
.