ดูเหมือนว่าเครื่องมือที่เหมาะสมสำหรับงานนี้fseccomp
ขึ้นอยู่กับsync-ignoring
รหัส f โดย Bastian Blank ฉันมากับไฟล์ที่ค่อนข้างเล็กซึ่งทำให้ลูก ๆ ของมันไม่สามารถเปิดไฟล์เพื่อเขียนได้:
/*
* Copyright (C) 2013 Joachim Breitner <mail@joachim-breitner.de>
*
* Based on code Copyright (C) 2013 Bastian Blank <waldi@debian.org>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#define _GNU_SOURCE 1
#include <errno.h>
#include <fcntl.h>
#include <seccomp.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define filter_rule_add(action, syscall, count, ...) \
if (seccomp_rule_add(filter, action, syscall, count, ##__VA_ARGS__)) abort();
static int filter_init(void)
{
scmp_filter_ctx filter;
if (!(filter = seccomp_init(SCMP_ACT_ALLOW))) abort();
if (seccomp_attr_set(filter, SCMP_FLTATR_CTL_NNP, 1)) abort();
filter_rule_add(SCMP_ACT_ERRNO(EACCES), SCMP_SYS(open), 1, SCMP_A1(SCMP_CMP_MASKED_EQ, O_WRONLY, O_WRONLY));
filter_rule_add(SCMP_ACT_ERRNO(EACCES), SCMP_SYS(open), 1, SCMP_A1(SCMP_CMP_MASKED_EQ, O_RDWR, O_RDWR));
return seccomp_load(filter);
}
int main(__attribute__((unused)) int argc, char *argv[])
{
if (argc <= 1)
{
fprintf(stderr, "usage: %s COMMAND [ARG]...\n", argv[0]);
return 2;
}
if (filter_init())
{
fprintf(stderr, "%s: can't initialize seccomp filter\n", argv[0]);
return 1;
}
execvp(argv[1], &argv[1]);
if (errno == ENOENT)
{
fprintf(stderr, "%s: command not found: %s\n", argv[0], argv[1]);
return 127;
}
fprintf(stderr, "%s: failed to execute: %s: %s\n", argv[0], argv[1], strerror(errno));
return 1;
}
ที่นี่คุณจะเห็นว่ายังคงเป็นไปได้ที่จะอ่านไฟล์:
[jojo@kirk:1] Wed, der 06.03.2013 um 12:58 Uhr Keep Smiling :-)
> ls test
ls: cannot access test: No such file or directory
> echo foo > test
bash: test: Permission denied
> ls test
ls: cannot access test: No such file or directory
> touch test
touch: cannot touch 'test': Permission denied
> head -n 1 no-writes.c # reading still works
/*
มันไม่ได้ป้องกันการลบไฟล์หรือย้ายไฟล์หรือการดำเนินการไฟล์อื่น ๆ นอกเหนือจากการเปิด แต่สามารถเพิ่มได้
เครื่องมือที่ช่วยนี้ได้โดยไม่ต้องเขียนโค้ด C เป็นsyscall_limiter
strace
แจ้งให้คุณทราบว่าไฟล์ใดที่โปรแกรมกำลังเปิดอยู่ ทำไมคุณถึงต้องการทำเช่นนี้? มันเป็นโปรแกรมเฉพาะหรือคุณต้องการสิ่งนี้สำหรับการทดสอบหรืออย่างอื่น? คุณสามารถรันโปรแกรมเป็นผู้ใช้ / กลุ่มที่ไม่มีสิทธิ์เขียนเกือบทุกที่ยกเว้นในไดเรกทอรีปัจจุบันหรือไม่? การแจกแจงสมัยใหม่ของ Linux ใช้แนวคิดของกลุ่มสำหรับผู้ใช้แต่ละคนดังนั้นควรตั้งค่าได้ง่าย