누구든지 Linux에서 프로세스 권한을 루트로 변경하는 방법을 제안할 수 있습니까?
어떤 사용자가 일반 프로세스를 실행하고 있다고 가정해 보겠습니다. 저를 생각해 보세요. 이제 내 스크립트는 "useradd" 명령을 사용하여 일부 사용자를 생성해야 하며 몇 시간 후에 사용자 계정을 비활성화하려고 합니다. 5시간을 시간으로 삼자. 5시간마다 계정이 활성화되고, 5시간 후에는 계정이 비활성화됩니다.
이제 문제는 스크립트에 있습니다. "su" 명령만 입력하여 루트 액세스 권한을 얻으려고 하면 프롬프트가 표시됩니다. 글쎄, 내 의도는 원격 클라이언트(아마도 .net 또는 Java의 웹 서비스를 통해)에서 이 스크립트를 호출하는 것입니다.
그렇다면 프롬프트를 표시하지 않고 루트 모드로 변경하고 Linux에서 계정을 생성/활성화/비활성화할 수 있는 방법이 있습니까(누군가의 입력을 기다려야 함)? 루트 비밀번호가 있다고 가정 해 보겠습니다.
다음과 같은 파이프 명령을 사용해 보았습니다.
echo "password" | su
하지만 왠지 그 메시지가 생각나더군요. 메시지를 표시하지 않고 직접 스크립트를 성공적으로 실행하면 웹 서비스를 통해 동일한 작업을 계속 수행할 수 있습니다.
답변1
아마도 당신은 그것에 익숙할 것입니다 sudo command
. /etc/suoders file
만약 당신이 같은 것을 작성하고 싶다면, 당신은 그 코드를 읽을 수 있습니다.
답변2
~처럼MSV의견에서 언급했듯이 전체 전제는 다음과 같습니다.XY 문제이는 보안상 악몽이지만 비밀번호 없이 루트 액세스 권한을 얻는 문제를 해결하려고 노력하겠습니다.
첫째, 에서 비밀번호를 읽지 않고 읽기 위해 직접 열어서 echo "password" | su
작동하지 않습니다 . 도구가 있지만(예:su
stdin
/dev/tty
예상되는)을 사용하여 대화형 프로그램을 자동화할 수 있지만 보안 관점에서 루트가 특정 명령을 호출하기 위해 자동으로 루트 셸을 얻는 것은 위반하기 때문에 좋지 않습니다.최소 권한의 원칙.
즉, su
다음과 같은 방법을 사용하여 인증을 자동화할 수 있습니다.expect
#!/usr/bin/expect -f
spawn su
expect "Password:"
send "password\n";
interact
루트 자격 증명 없이 특정 명령을 루트로 호출할 수 있도록 하는 것이 목표라면 작업에 적합한 도구는 다음과 같습니다.sudo
. 예를 들어 wheel
그룹의 사용자가 비밀번호를 입력하지 않고 실행할 수 있도록 하려면 명령에 다음 스탠자를 추가하면 useradd
됩니다 /etc/sudoers
.sudoedit
%wheel ALL = NOPASSWD: /usr/sbin/useradd
이러한 권한을 설정할 때는 적어도 해당 기능이 특정 사용자나 독점 그룹으로 제한되도록 하는 것이 좋습니다.
CGI 스크립트 또는 유사한 방법을 통해 사용자를 추가하기 위해 이 방법을 사용하는 경우 일반적으로 웹 연결 소프트웨어에 이러한 권한을 직접 부여하기보다는 둘 사이에 어느 정도 권한 분리를 추가하는 것이 좋습니다. 실제 권한은 웹 애플리케이션이 (IPC를 통해) 대신 권한 있는 작업을 수행하도록 요청하는 데몬과 같은 별도의 소프트웨어 구성 요소에 부여될 수 있습니다. 이러한 방식으로 권한 있는 프로세스와 웹 애플리케이션 모두 입력 유효성 검사를 완료하여 웹 애플리케이션에서 악용 가능한 결함의 위험을 최소화할 수 있으며, useradd
권한 있는 작업을 임의의 매개변수(이 경우)로 호출할 수 있습니다. 또는 더 나쁜 것은 예를 들어 다음과 같습니다. 높은 권한으로 임의의 코드를 실행합니다.
답변3
나는 이 상황을 위해 고안된 두 가지 도구인 Expect(기대)와 비어 있음(Empty)을 알고 있습니다. 그들은 모두 프로그램이 표준 입력을 듣고 미리 결정된 값을 제공할 때까지 기다립니다. Expect는 TCL을 기반으로 하며 비교적 큰 사용자 기반을 보유하고 있습니다. 비어 있음은 종속성이 적지만 지원 수준도 낮을 수 있습니다. 이 간단한 문제를 해결하려면 모든 페이지에 충분한 문서가 있어야 합니다.