비밀이 포함된 파일과 파일을 읽고 라이센스와 같은 것을 생성하는 생성기 응용 프로그램이 있습니다.
이 Linux 컴퓨터의 사용자는 애플리케이션을 사용할 수 있습니다.
애플리케이션은 비밀 파일을 읽기 때문에 이러한 사용자는 파일에 대한 읽기 권한이 있어야 합니다.
이러한 사용자에 대한 읽기 권한을 제거하고 해당 사용자가 응용 프로그램을 실행할 때 응용 프로그램이 응용 프로그램을 통해서만 파일을 읽도록 하는 방법이 있습니까?
나는 응용 프로그램을 실행하는 사람이 파일을 통해서만 파일을 읽을 수 있기를 원합니다. 그 뿐만 아니라 cat
그것이 무엇인지 지켜보십시오.
- 해결 방법을 봤습니다
chmod 400 secret_file
chmod 110 generator
chmod u+s generator
이런 방식으로 같은 그룹의 사용자는 generator
실행할 수는 있지만 generator
읽을 수는 없습니다 secret_file
.
하지만 generator
나에게는 그것이 있기 setuid
때문에 generator
읽을 수 있다 secret_file
.
이것은 좋은 솔루션이지만 사용자 이름을 포함하고 싶고 generator
이 솔루션을 사용하면 항상 소유자 이름을 얻을 수 있습니다.
이것이 c/cpp 애플리케이션에서 사용자 이름을 얻는 방법입니다.
#include <pwd.h>
uid_t uid = geteuid();
struct passwd *pw = getpwuid(uid);
std::string user_name = pw->pw_name;
이 문제를 해결할 다른 방법이 있나요? 도울
수 있니 apparmor
? (내가 이해할 수없는)
후속 질문 - 특정 스크립트에 의해서만 파일을 실행 가능하게 만드는 방법이 있습니까? generator
쉘에서 실행하고 싶지 않다는 뜻입니다 . 나는 직선 주자가 실패하고 직선 주자가 성공하기를 원하기 때문에 generator.sh
호출되는 다른 스크립트에서만 실행 되기를 원합니다 .generator
generator.sh
generator
generator.sh
답변1
사용getuid()
바꾸다 geteuid()
.
~에서execve()
매뉴얼 페이지:
set-user-ID 비트가 경로 이름으로 참조되는 프로그램 파일에 설정된 경우유효한 사용자 ID호출 프로세스의 이름은 프로그램 파일 소유자의 이름으로 변경됩니다.
반환된 "실제" 사용자 ID는 getuid()
변경되지 않습니다. 즉, 프로세스를 시작한 사용자의 UID입니다.
또 다른 한가지:
쉘에서 생성기를 실행하고 싶지 않습니다. 나는 Generator.sh에서 더 많은 작업을 수행하기 때문에 Generator를 호출하는 다른 스크립트 Generator.sh에서만 실행되기를 원합니다.
setuid 스크립트를 가질 수 없기 때문에 더욱 어렵습니다. 그러나 스크립트만 실행하는 setuid 래퍼가 있을 수 있으며, 그런 다음 최종 바이너리를 실행할 수 있습니다. 또는 sudo를 사용하여 스크립트를 실행하세요. 그러나 쉘이 setuid를 좋아하지 않는다는 문제가 발생할 수 있습니다.setuid 비트는 bash에 영향을 미치지 않는 것 같습니다.그리고쉘 스크립트에 setuid 설정 허용.
또한 참고하시기 바랍니다셸을 포함하면 추가적인 보안 문제가 발생할 수 있으며, 다른 setuid 프로그램과 마찬가지로 실행 환경이 깨끗한지 확인해야 합니다. 여기에는 환경 변수와 파일 설명자가 포함되지만 다른 상속 가능한 기능도 포함될 수 있습니다. sudo를 사용하는 한 가지 이유는 최소한 그러한 문제를 처리하려고 시도하기 때문입니다.
또 다른 더 나은 방법이는 권한 있는 프로세스를 네트워크 서비스로 구현하고 사용자가 간단한 멍청한 클라이언트 프로그램만 실행할 수 있도록 합니다.