표준 사용자가 특정 매개변수를 사용하여 명령을 실행하지 못하도록 제한

표준 사용자가 특정 매개변수를 사용하여 명령을 실행하지 못하도록 제한

명령에 대한 실행 권한을 제거하여 표준 사용자가 명령을 실행하지 못하도록 제한하는 방법을 알고 있습니다. 그러나 표준 사용자가 특정 옵션/인수를 사용하여 명령을 실행하지 못하도록 제한하는 것이 가능합니까?

예를 들어, 표준 사용자는 다음 명령을 실행할 수 있어야 합니다.

ls

하지만:

ls -l

표준 사용자가 실행할 수 있는 chsh또는 같은 명령이 있지만 실행하면 권한이 거부되기 때문에 이것이 가능하다고 생각합니다 .passwdchsh rootpasswd -a -S

답변1

유일한 방법은 문제의 명령/유틸리티에 래퍼를 직접 작성하고 이를 시작한 사용자의 (E)UID를 기반으로 무엇을 허용할지 여부를 결정하도록 하는 것입니다. 예를 들어 언급한 도구는 이 작업을 수행 chsh하거나 passwd구현에 이 기능을 내장할 수 있습니다.

래퍼 작성 방법ls

#!/usr/bin/perl

use strict;
use warnings;

my $problematic_uid = 1000; # For example
my $is_problematic = $< == $problematic_uid;
unless(/ -l / ~~ @ARGV or $is_problematic){
    exec qq{/new/path/to/ls }.join '',@ARGV
}else{
    die "Sorry, you are not allowed to use the -l option to ls\n"
}

원래 경로 가 ls사용자의 에 있지 않은지 확인해야 합니다 PATH. /new/path/to/ls문제는 이 래퍼를 사용하려면 사용자가 원본 래퍼를 실행할 수 있어야 하므로 ls사용자가 ls원본 래퍼를 직접 호출하여 이를 우회할 수 있다는 것입니다.

답변2

chsh및 같은 명령은 passwd특별히 코딩되어 있습니다. 그들은 추가 권한을 가지고 실행됩니다(그들은설정값) 루트) 자체 인증 메커니즘을 포함합니다. 둘 다 어떤 사용자가 자신에게 전화를 걸고 있는지 확인하고 루트가 아닌 사용자만 해당 기능의 하위 집합을 사용할 수 있도록 허용합니다.

chsh그리고 passwd그것은 예외적입니다. 대부분의 명령은 누가 호출하는지 상관하지 않습니다.

사용자가 특정 명령을 실행하는 것을 금지하는 것은 의미가 없습니다. 사용자는 자신의 실행 파일을 제공하는 등 다른 방법을 통해 명령이 수행하는 모든 작업을 수행할 수 있습니다.

화이트리스트에 포함된 명령 세트만 실행할 수 있는 제한된 계정을 생성할 수 있습니다.제한된 껍질, 또는 데이터 전송에만 사용되는 계정,RSSH 또는 scponly.

사용자가 상승된 권한(보통 을 통해 sudo)으로 특정 명령을 실행하도록 허용하고 특정 옵션 조합에 대해서만 허용하려면 옵션을 확인하고 사용자가 래퍼 스크립트를 실행할 수 있도록 허용하는 래퍼 스크립트를 작성하세요.

답변3

Rahul의 답변은 귀하가 원하는 것은 a) 좋은 생각이 아니며 b) 아마도 사용자 정의 쉘을 생성해야만 가능하기 때문에 귀하의 질문과 관련이 있습니다. 이와 같은 실행 파일은 ls자체적으로 인수를 처리하는 별도의 자체 포함 프로그램입니다. 사용자가 이를 사용하지 못하도록 하려면 사용자 ls -l정의를 직접 작성하고 컴파일해야 합니다 ls. 이는 쉽지 않습니다. 그리고 변경하려는 명령마다 일일이 작업을 해야 하기 때문에 시간도 많이 걸립니다.

당신은 할 수아마도bash전체 쉘(귀하의 경우 가능)을 사용자 명령을 필터링하는 다른 쉘로 완전히 교체해 보십시오. 예를 들어, 실제로 호출하기 전에 명령줄에서 제거를 시도할 수 있습니다 -l. 그러나 쉘과 쉘에서 실행할 수 있는 명령은 종종 매우 강력하고 복잡한 구문을 갖고 있기 때문에 말처럼 쉽지 않습니다. 필터를 사용하면 버그와 손상된 콘텐츠가 남을 수 있습니다.lsls

표준 사용자가 실행할 수 있는 chsh또는 같은 명령이 있지만 실행하면 권한이 거부되기 때문에 이것이 가능하다고 생각합니다 .passwdchsh rootpasswd -a -S

그것은 완전히 다른 이야기입니다. 왜냐하면 이것이 이 프로그램이 작성되는 방식이기 때문입니다. 동작을 변경하려면 ls소스 코드를 수정하고 다시 컴파일해야 합니다.

관련 정보