GNU/Linux >> LINUX-Kenntnisse >  >> Linux

So verhindern Sie, dass ein Prozess Dateien schreibt

Wie wäre es, wenn Sie eine leere Chroot erstellen und dann das Hauptdateisystem als schreibgeschützt innerhalb der Chroot per Bind-Mount einhängen?

Sollte wahrscheinlich so etwas sein, um einen schreibgeschützten Bind-Mount zu erstellen:

mount --bind /foo/ /path/to/chroot/
mount -o remount,ro /path/to/chroot/

Sie können auch andere Verzeichnisse per Bind-Mount einhängen, auf die das Jail Schreibzugriff haben soll. Seien Sie vorsichtig, wenn Sie spezielle Verzeichnisse (/dev/, /proc/, /sys/) per Bind-Mount einhängen müssen, da das Mounten im vorliegenden Zustand unsicher sein kann.


Das richtige Werkzeug für diesen Job scheint fseccomp zu sein Basierend auf sync-ignoring f code von Bastian Blank habe ich mir diese relativ kleine Datei ausgedacht, die bewirkt, dass alle ihre Kinder eine Datei nicht zum Schreiben öffnen können:

/*
 * Copyright (C) 2013 Joachim Breitner <[email protected]>
 *
 * Based on code Copyright (C) 2013 Bastian Blank <[email protected]>
 *
 * 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;
}

Hier sehen Sie, dass es weiterhin möglich ist, Dateien zu lesen:

[[email protected]: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
/*

Es verhindert nicht das Löschen oder Verschieben von Dateien oder andere Dateioperationen außer dem Öffnen, aber das könnte hinzugefügt werden.

Ein Tool, das dies ermöglicht, ohne C-Code schreiben zu müssen, ist syscall_limiter.


Würden Sie erwägen, einen Ersatz für open(…) zu schreiben Funktion und laden sie mit LD_PRELOAD?


Linux
  1. Journalctl:Wie verhindert man, dass Text im Terminal abgeschnitten wird?

  2. Wie kopiert man Dateien von Wine auf den Desktop?

  3. So bestimmen Sie, welcher Prozess in Linux auf die Festplatte schreibt

  4. Wie listet man kürzlich gelöschte Dateien aus einem Verzeichnis auf?

  5. Wie entferne ich ungültige Zeichen aus Dateinamen?

So verhindern Sie ein Timeout von SSH

So laden Sie Dateien von Remote-Linux-Servern herunter

So finden Sie den Prozessnamen anhand seiner PID

Wie verschiebt man alle Dateien vom aktuellen Verzeichnis in das obere Verzeichnis?

Wie kann ich verhindern, dass ein Benutzer Dateien auf eine andere Festplatte kopiert?

Wie kann man verhindern, zu SWAP zu gehen?