Whitelist restricted shell

alter_Bekannter

N.A.C.J.A.C.
Registriert
14 Juli 2013
Beiträge
4.759
Ort
Midgard
Gibts dafür keine offitzielle Lösung?

Gefunden habe ich nur:



System ist ein Debian 8.
Der Nutzer soll außerhalb seiner /home überhaupt nichts dürfen. Ausführen dürfen soll er nur was in der Whitelist steht. Um das System quasi komplett selber ohne die hilfe von apt konfigurieren zu müssen, müssen aber letzlich doch einige Sachen publöic lesbar sein. Also muss ich den User möglichst effektiv in sein /home einsperren.
Sachen von anderen die er lesen darf mounte ich ihm einfach read only da rein.
 
Genau, chroots funktionieren.

Wenn dir das nicht ausreicht, schau dir mal LXC an.
 
  • Thread Starter Thread Starter
  • #4
Gibt es für den Prozess keine Möglichkeit da raus zu navigieren? Oder es zu beenden?



Ist das so zu verstehen das nur root da einfach wieder raus kann aber kein anderer Nutzer? In dem Fall würde es wohl reichen.


Ich begreif nicht wie chroot überhaupt ins Thema passt. Ich werde den Prozess in Frage ganz sicher nicht als root starten. Entweder sind die Informationen zu chroot widersprüchlich oder es passt nicht ins Thema. Je mehr ich darüber lese desto weniger denke ich das es hierfür geeignet ist.
 
Zuletzt bearbeitet:
  • Thread Starter Thread Starter
  • #6
Im Text wird von einem C Programm gesprochen dessen Sourcecode wohl nicht mehr online ist. Damit fällt es wohl auch flach das zu kompilieren.

toter Link:
 
den Source gibt es schon noch:

[src=c]/*
* chrlogin.c -- chroot login
* acts as login shell in /etc/passwd for a user who has to completely
* live in a chroot environment
*
* Harald Weidner <hweidner@gmx.net>
* First release: 1999-06-30
* Last update: 2002-09-01
*
* Installation:
* compile: gcc -Wall -O2 -s chrlogin.c -o chrlogin
* install: cp to /usr/local/sbin, chown root, chmod 4755
* create chroot directory (here: /home/chroot)
* create base file system under /home/chroot
* DISABLE all setuid root binaries under /home/chroot !!!
*
* Install a user:
* create a user using 'adduser'; set password with 'passwd'
* set /usr/local/sbin/chrlogin als login shell for that user in /etc/passwd
* create a user in the chroot-Environment
* (e.g. by filling out /home/chroot/etc/passwd and creating
* /home/chroot/home/<username> by hand; that user should have the same
* uid and gid as in /etc/passwd; login shell must be /bin/bash)
*
* This code is released under the terms of the GNU General Public
* License (GPL). THERE IS NO WARRANTY! USE AT YOUR OWN RISK!
* See http://www.fsf.org/licenses/gpl.html for the full text of the GPL.
*/


/* ----- Configuration parameters ---------------------------------------- */

/* shell for chroot'ed users */

#define SHELL "/bin/bash"

/* chroot directory level
* This parameter defines, how many subdirs, beginning from the
* root directory /, are treated as the root of the chroot environment.
* Example:
* with CHROOT_LEVEL of 2, /home/chroot/home/joe means:
* 0 1 2 3
* /home/chroot is the chroot base directory,
* /home/joe is the home directory within the chroot environment
*/
#define CHROOT_LEVEL 2

/* ----- End of configuration parameters --------------------------------- */



#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <pwd.h>
#include <sys/types.h>
#include <sys/stat.h>

#define MAX_STRING 1024


int main(int argc, char *argv[], char *envp[])
{
int real_user = getuid();
struct passwd *pw_ent = NULL;
struct stat stat_buf;
char *p;
int cnt;
char home_dir[MAX_STRING], shell[MAX_STRING], chroot_dir[MAX_STRING];


/* sanity checks */

if(geteuid() != 0) {
fprintf(stderr, "%s: This program needs to be setuid root.\n",
argv[0]);
exit(-1);
}

if(real_user == 0) {
fprintf(stderr, "%s: The target user must not be root.\n",
argv[0]);
exit(-1);
}


/* look up user in system's /etc/passwd */

if((pw_ent = getpwuid(real_user)) == NULL) {
fprintf(stderr, "%s: User #%d does not exit in /etc/passwd.\n",
argv[0], real_user);
exit(-1);
}


/* check home directory */

strncpy(chroot_dir, pw_ent->pw_dir, MAX_STRING - 1);
chroot_dir[MAX_STRING] = 0;

if(chroot_dir[0] != '/') {
fprintf(stderr, "%s: Home directory %s does not begin with '/'.\n",
argv[0], chroot_dir);
}

if(stat(chroot_dir, &stat_buf) != 0) {
fprintf(stderr, "%s: Home directory %s does not exist:\n%s\n",
argv[0], chroot_dir, strerror(errno));
}


/* extract chroot directory */

for(p = chroot_dir, cnt = -1 ; *p; p++) {
if(*p == '/')
cnt++;
if(cnt == CHROOT_LEVEL) {
*p = 0;
break;
}
}

if(cnt < CHROOT_LEVEL) {
fprintf(stderr, "%s: Home directory %s is too short to reach "
"chroot shell level %d.\n",
argv[0], chroot_dir, CHROOT_LEVEL);
exit(-1);
}


/* check existance of SHELL */

strncpy(shell, chroot_dir, MAX_STRING);
strncat(shell, SHELL, MAX_STRING - strlen(shell));

if(stat(shell, &stat_buf) != 0) {
fprintf(stderr, "%s: Could not access login shell %s:\n%s\n",
argv[0], shell, strerror(errno));
exit(-1);
}
if(!S_ISREG(stat_buf.st_mode)) {
fprintf(stderr, "%s: Login shell %s must be a regular file.\n",
argv[0], shell);
exit(-1);
}


/* enter chroot environment */

if(chdir(chroot_dir) != 0) {
fprintf(stderr,
"%s: Could not chdir() to new root directory %s:\n%s\n",
argv[0], chroot_dir, strerror(errno));
exit(-1);
}
if(chroot(chroot_dir) != 0) {
fprintf(stderr,
"%s: Could not chroot() to new root directory %s:\n%s\n",
argv[0], chroot_dir, strerror(errno));
exit(-1);
}
setuid(real_user);


/* look up user in chroot's /etc/passwd */

if((pw_ent = getpwuid(real_user)) == NULL) {
fprintf(stderr, "%s: Could not find user #%d in chroot's /etc/passwd.\n",
argv[0], real_user);
exit(-1);
}


/* change to users home directory */

if(chdir(pw_ent->pw_dir) != 0) {
fprintf(stderr,
"%s: Could not chdir to new home directory %s for user #%d:\n%s\n",
argv[0], pw_ent->pw_dir, real_user, strerror(errno));
exit(-1);
}


/* adapt command name */
argv[0] = pw_ent->pw_shell;


/* adapt HOME environment variable */
strcpy(home_dir, "HOME=");
strncat(home_dir, pw_ent->pw_dir, MAX_STRING - strlen(home_dir));
putenv(home_dir);

/* execute shell */
execve(SHELL, argv, envp);

return 0;
}[/src]

Oder das Toolkit hier:


kommt vor allem auch darauf an wie dein User eigentlich zugreifen soll.
per ssh oder interaktiv am pc?
 
  • Thread Starter Thread Starter
  • #8
Der user kann sich eigentlich garnicht einloggen, es geht mehr um dern fall das die Anwendung eine Lücke hat die irgendwem erlaubt was rein zu schmeissen.

Ich wiull das im Fall der Fälle ein Angreifer vor nichts als Lesezugriff auf ein Verzeichnis steht solange es keine Lücke zum erlangen von root rechten gibt.
 
Der user kann sich eigentlich garnicht einloggen, es geht mehr um dern fall das die Anwendung eine Lücke hat die irgendwem erlaubt was rein zu schmeissen.

Also oder ?

Oder Linux namespaces? Letzteres ließe sich via umsetzen.

EDIT: Achja, da es sich um einen Server handelt, ist eigentlich auch angebracht. Lass dir bitte nicht alles aus der Nase ziehen.
 
Zuletzt bearbeitet:
  • Thread Starter Thread Starter
  • #10
Das ganze soll am Ende noch bezahlbar sein.

Die Vorschläge sind gut gemeint, soviel wird der Abnehmer aber nicht zahlen. Also bitte keine Vorschläge die zur Erstkonfiguration mehr als 2 Tage brauchen wenn mans vorher noch nicht kannte.

In anderen Worten:
Nicht in den Paketquellen = 90% abgelehnt
 
Firejail ist in vielen Paketquellen enthalten und auch sonst schnell zu kompilieren.

LXC und Docker sind in den meisten Paketquellen enthalten.

Was für ein obskures, veraltetes Linux setzt du denn ein? Ubuntu 7.04?
 
  • Thread Starter Thread Starter
  • #12
Das System ist nicht das Problem Debian 8 siehe Startpost.

Okay, mein Fehler, bin wohl heute etwas zu entnervt, ich guck mir das morgen nochmal an.
 
Und Debian 9 "Stretch" als auch LXC, Docker und selbstverständlich auch nen 4.x-er Kernel, der die ganzen tollen neuen Features unterstützt.

Ich würde es mir wie gesagt mit Firejail einfach machen.
 
Zurück
Oben