1) 새로운 사용자가 관리자 권한을 부여하지 않고도 계정을 만들 수 있도록 하는 안전한 방법을 찾으려고 노력 중입니다. 내 시스템에 이미 계정이 있고 UNIX 명령줄에 액세스할 수 있는 경우 puTTY와 같은 프로그램을 사용하여 액세스할 수 있습니다. 저는 현재 드롭박스와 비슷한 레이아웃으로 시각적으로 파일을 주고받을 수 있는 프로그램을 만들고 있습니다. 그러나 "새 사용자 만들기" 기능을 추가하고 싶지만 이 작업을 안전하게 수행하는 방법을 모르겠습니다.
물론 프로그램에서 "sudo adduser jim"과 같은 작업을 수행하고 sudo 비밀번호를 제공하도록 할 수 있지만 그러려면 jar 파일에 관리 비밀번호를 포함해야 합니다. 난독화 프로그램이 있다는 것을 알고 있지만 이것이 반드시 더 안전하지는 않습니다. 나는 사용자를 생성하기 위해 SSH를 사용하는 것을 선호하지만 작동하고 안전한 모든 방법에 열려 있습니다.
2) 방금 생각난 게 있어요. sudo 기능이 새 사용자 생성으로 제한된 관리 사용자를 생성하면 어떻게 됩니까? 이것이 합리적으로 안전한 솔루션처럼 들리나요? 그렇다면 어떻게 해야 할까요? 그렇지 않다면 이 접근법의 단점은 무엇입니까?
편집: 지금까지의 해결책은 다음과 같습니다. 입력을 삭제했다고 가정하고 첫 번째 인수를 사용자 이름으로, 두 번째 인수를 비밀번호로 사용하고 권한(setuid 비트)을 다음으로 설정하는 스크립트를 만듭니다. 쓰기가 불가능하며, 루트가 아닌 계정으로 실행하면 루트 권한으로만 실행할 수 있습니다. 이것은 지금까지 가장 기본적인 코드입니다.
adduser --disabled-password --gecos "" "$1"
echo "$1":"$2" | chpasswd
어떻게 생각하나요? 어떻게 하면 개선할 수 있을 것 같나요?
답변1
유일한 문제가 sudo
비밀번호를 사용해야 하는 경우 파일에 태그를 추가 할 수 있습니다 NOPASSWD
. sudoers
당신이 원하는
some_user ALL = (ALL) NOPASSWD:/path/to/adduser
답변2
이 문제를 해결하는 방법은 여러 가지가 있지만 저는 사용자 정보를 가져와 실행하는 작은 프로그램이나 스크립트를 작성하겠습니다 adduser
. 프로그램은 루트가 소유하며 setuid 비트가 설정됩니다.
가능한 한 간단하게 유지하십시오. 입력 내용을 제대로 삭제하지 않으면 보안 취약점이 발생할 수 있습니다. 그럼에도 불구하고 시스템에 사용자를 추가하는 것은 위험한 일입니다. 그러나 이 전략의 이점은 전체 실행 파일을 루트로 실행할 필요가 없고 사용자의 스크립트/프로그램만 추가된다는 것입니다.
편집하다:
입력을 삭제하는 방법은 프로그램을 구현하는 방법에 따라 다릅니다. C로 작성하는 경우 system() 대신 execve() 함수를 사용하십시오. 가지다CERT에서 활용할 수 있는 정리 실패의 예가 포함된 훌륭한 문서. Python으로 작성하는 경우 선호하위 프로세스 모듈system()과 비슷한 이유입니다.
특별한 요구사항이 없는 한 문자나 숫자가 아닌 모든 문자를 삭제하여 정리하겠습니다. 사용자가 비밀번호를 생성합니까? 그렇다면 더욱 어렵습니다. 요점은 호출하는 쉘이나 프로그램에 특별한 의미가 있는 특수 문자를 전달하는 것을 원하지 않는다는 것입니다. Bash의 경우 몇 가지 명백한 것은 $
, ;
, 입니다 &&
. mysql의 경우 최소한 '
, "
및 을 방지하려고 합니다 ;
.
불행히도 소독은 어려운 작업이 될 수 있습니다. 사용자가 사용해야 할 모든 값을 열거할 수 있다면 화이트리스트를 사용하는 것이 좋습니다.