이것이 너무 기본적이어서 나에게 RTFM을 던지고 싶다면 용서해 주십시오. 사용자에게 동일한 파일에 대한 읽기 권한을 부여하면서 특정 파일을 복사하는 것을 방지하고 싶습니다. 만나기 전까지는 불가능하다고 생각했는데이것SELinux Wiki의 예:
allow firefox_t user_home_t : file { read write };
그래서 문제의 파일에 대해 0700 모드를 제공하고 SELinux를 사용하여 사용자가 일반적으로 파일을 읽는 데 사용하는 응용 프로그램에 대한 읽기 액세스 권한만 부여할 수 있는지 궁금합니다.
다시 한 번 말씀드리지만, 너무 기본적인 이야기라면 죄송합니다. 일정이 빡빡해서 어떤 식으로든(가능하든 불가능하든) 상사에게 최대한 빨리 답변을 드리고 싶은데, 잘 모르겠습니다. SELinux에 대해서는 아무것도 모르기 때문에 시간이 너무 많이 걸릴지 알아보기 위해 직접 읽어보는 것이 걱정됩니다. 나는 읽는 데 반대하지 않습니다.그 자체관련 문서가 있으면 감사하겠습니다.
기본적으로 제 질문은 SELinux에서 이를 수행할 수 있는 방법이 있습니까? 아니면 그러한 대안을 추구하는 데 시간을 낭비하고 있습니까?입니다.
추신: 읽기 액세스 권한을 부여하면 실제로 파일을 복사하려는 사용자가 파일을 읽는 데 사용할 응용 프로그램에서 해당 파일을 복사하여 붙여 넣을 수 있다는 것을 알고 있습니다.
편집하다
내 사용 사례를 더 잘 설명하려면 다음을 수행하세요.
- 문제의 파일은 텍스트 파일과 바이너리 파일이 혼합되어 있습니다.
- 이는 독점 상용 소프트웨어로 읽어야 합니다. 전자 시뮬레이션 소프트웨어용 시뮬레이션 모델입니다.
- 모델 자체는 독점적이며 시뮬레이션에 사용하는 사용자가 무단 사용을 위해 유출하는 것을 원하지 않습니다.
- 소프트웨어는 모델을 읽고 이러한 파일에서 일부 스크립트를 실행하기만 하면 되며, 해당 내용은 어디에도 기록되지 않습니다.
- 간단히 말해서, 에뮬레이션 소프트웨어가 사용자의 읽기 액세스를 차단하면서 이러한 파일을 읽고 실행할 수 있기를 원합니다.
답변1
cat
위의 의견에서 이것이 문제가 아니라 쉘 리디렉션이라는 점을 기억하는 것이 중요하다고 생각합니다 . 바이너리 또는 텍스트 파일의 복사를 제한하려고 하시나요? 바이너리 파일이라면 rbash를 사용하여 몇 가지 문제를 해결할 수 있다고 확신합니다(참조http://blog.bodhizazen.net/linux/how-to-restrict-access-with-rbash/).
그러나 텍스트 파일인 경우 누군가가 로컬 터미널에서 복사하는 것을 어떻게 막을 수 있는지 잘 모르겠습니다.
일반적인 SELinux 솔루션이 여기서 도움이 될지 확신할 수 없습니다. 파일을 읽는 애플리케이션이 어디에나 데이터를 써야 합니까? 그렇지 않고 응용 프로그램에서 파일을 읽기만 하면 되는 경우 읽기를 원하는 유형의 파일에 대한 읽기 전용 액세스 권한을 응용 프로그램에 부여할 수 있지만 쓰기에서는 해당 파일에 대한 액세스 권한을 부여할 수 없습니다.
귀하의 사용 사례에 필요한 정확한 권한에 대한 자세한 정보가 도움이 될 것이라고 생각합니다. 모호한 답변을 드려 죄송합니다.
업데이트 - 더 구체적인 답변
SELinux 없이도 원하는 것을 얻을 수 있다고 생각합니다. 왜냐하면 이것이 처리되기 때문입니다(예: 일반 사용자가 명령을 통해 /etc/shadow에서 비밀번호를 변경하는 경우 passwd
).
- 비즈니스 소프트웨어에 대한 별도의 사용자 및/또는 그룹 만들기(아마도 이미 완료됨)
- 해당 사용자 및/또는 그룹에 파일에 대한 읽기 전용 액세스 권한을 부여합니다.
- 일반 사용자가 이 파일에 액세스할 수 없도록 하세요.
- 실행 파일을 setuid 또는 getgid로 만듭니다(그룹 또는 사용자 사용 여부에 따라 다름)
chmod g+s
.chmod u+s
- 사용자가 애플리케이션을 실행하면 이제 애플리케이션 사용자 또는 그룹과 동일한 권한을 갖게 되므로 원하는 애플리케이션 내의 특정 파일에 대한 읽기 액세스가 허용됩니다.
업데이트 2 - 여러 사용자 및 그룹
여러 개의 애플리케이션과 그룹이 있는 경우 를 사용할 수 있습니다 sudo
. 많은 사람들이 루트로 명령을 실행할 수 있다는 것을 알고 있지만 그 유용성은 이 예보다 훨씬 뛰어납니다. 이것이 이상적인 설정인지는 확실하지 않지만, 이는 귀하가 하려는 일을 달성하기 위한 한 가지 방법입니다.
해당 응용 프로그램이 모든 응용 프로그램 파일을 소유하도록 만들 수 있지만 그런 다음 각 파일 집합에 대해 별도의 그룹을 만들 수 있습니다. 파일 /etc/sudoers
또는 그 안에 포함된 파일은 /etc/sudoers.d/
다음과 같습니다.
User_Alias FILEGROUP1 = user1, user2
User_Alias FILEGROUP2 = user3, user4
Cmnd_Alias MYEDITOR = /usr/local/bin/myeditor, /usr/local/bin/mycompiler
FILEGROUP1 ALL=(:fileset1) NOPASSWD: MYEDITOR
FILEGROUP2 ALL=(:fileset2) NOPASSWD: MYEDITOR
이 그룹이 소유한 파일에 대한 액세스 권한이 필요하며 user1
이 그룹이 소유한 파일에 대한 액세스 권한이 필요합니다. 사용자 대신 그룹을 사용할 수도 있습니다.user2
fileset1
user3
user4
fileset2
사용자는 편집기 실행이나 유사한 작업을 통해 sudo -g fileset1 /usr/local/bin/myeditor
파일에 액세스 할 수 있습니다.
sudo -g
특히 그래픽 응용 프로그램인 것처럼 들리기 때문에 사용자에게 필요한 명령에 대한 일부 래퍼 스크립트를 만드는 것이 도움이 될 수 있습니다.
자세한 내용은:
http://www.garron.me/linux/visudo-command-sudoers-file-sudo-default-editor.html
https://serverfault.com/questions/166254/change-primary-group-with-sudo-ug
답변2
이것은 게 방식으로만 달성할 수 있습니다. 문제는 "copy()" 시스템 호출이 없다는 것입니다. 파일 복사는 소스를 읽고 대상에 쓰기/생성하여 수행됩니다.
따라서 유일한 기회는 복사본 생성이 허용되지 않는 응용 프로그램으로 이러한 파일에 대한 액세스를 제한하는 것입니다. "복사 금지"는 일반적으로 응용 프로그램의 디자인 목표가 아니기 때문에 평가가 어려울 수 있습니다. Firefox는 분명히 이에 적합하지 않습니다.
그러나 두 가지 수준의 솔루션을 사용할 수 있습니다.
- Firefox의 쓰기 액세스를 특정 디렉토리(트리)로 제한합니다. /tmp를 고려하면 이는 사악해질 수 있습니다. 따라서 구성 디렉터리의 위치를 가리키는 $TMP를 사용하여 Firefox를 시작해야 할 수도 있습니다.
- 다른 모든 응용 프로그램(사용자가 액세스할 수 있음)이 이 디렉터리를 읽지 못하도록 합니다. (내 AppArmor 관점에서 볼 때) 이는 로그인 프로세스가 모든 사용자에 대해 이러한 디렉터리에 액세스하지 못하도록 비활성화하고 Firefox에 대한 액세스 권한을 부여하는 것으로 요약됩니다.
보다 일반적이지만 간접적인 방법: 어떤 파일이 생성되었는지 확인하고 금지된 파일과 비교합니다. 응용 프로그램에 두 개의 파일이 동시에 열려 있으면 이는 매우 쉽지만 안전하지 않은 가정일 수 있습니다. 또한 물론 strace를 통해 모든 것을 실행한다고 해서 시스템이 더 빨라지는 것은 아닙니다. FAM/fileschanged가 전체 파일 시스템에서 어떻게 확장되는지 모르겠습니다. 이 확장 문제(존재하는 경우)는 모든 응용 프로그램(파일 관리자 제외)이 단일 디렉터리(및 해당 구성 디렉터리)에 쓰기 액세스를 허용하도록 제한하여 해당 디렉터리(및 /tmp )에만 FAM 검색이 필요하도록 "해결"할 수 있습니다. . 보호된 모든 파일에 대한 각 프로세스의 읽기 액세스를 기록하여 이러한 검사 속도를 높일 수 있습니다. FAM은 이를 수행할 수 없지만 AppArmor 감사는 이를 수행할 수 있습니다(따라서 SELinux도 이를 수행할 수 있다고 생각합니다).
매우 좋은 해결책은 쓰기 가능한 디렉터리에 대해 FUSE 모듈을 사용하여(경합 조건을 방지하기 위해) 검사를 수행하는 것입니다.