comment créer une étiquette SELinux personnalisée

11

J'ai écrit un service / une seule application binaire que j'essaie d'exécuter sur Fedora 24, il fonctionne à l'aide de systemd, le binaire est déployé sur /srv/bot

ce service / application que j'ai écrit doit créer / ouvrir / lire et renommer des fichiers dans ce répertoire.

J'ai d'abord commencé à créer une nouvelle politique basée sur SELinux: autoriser un processus à créer n'importe quel fichier dans un certain répertoire

mais lorsque mon application devait être renommée, la sortie contenait un avertissement:

#!!!! WARNING: 'var_t' is a base type.
allow init_t var_t:file rename;

J'ai cherché sur Google et j'ai découvert que je devrais utiliser une étiquette SELinux plus spécifique qu'un type de base, mais tous les exemples en ligne vous montrent des étiquettes existantes de httpd / nginx / etc.

Existe-t-il un moyen de créer une étiquette personnalisée uniquement pour ma propre application?

Mon idée est de créer quelque chose comme myapp_var_t, utilisez

semanage fcontext -a -t my_app_var_t '/srv/bot(/.*)?'
restorecon -R -v /srv/bot

et un .ppfichier personnalisé qui utilisera ce type personnalisé

S'il existe un meilleur moyen de le résoudre, cela fonctionne aussi.

Merci

Mise à jour

Après plus de recherches, je pense que le terme approprié pour ce que je veux faire est d'en créer de nouvelles typesqui m'ont conduit à https://docs.fedoraproject.org/en-US/Fedora/13/html/SELinux_FAQ/index.html#id3036916

qui dit essentiellement, exécutez

sepolgen /path/to/binary

et j'ai pu obtenir un modèle que je peux ensuite compiler dans un fichier pp et charger, toujours obtenir des erreurs mais il me semble que je suis plus proche de ce que je veux faire.

Si je le fais fonctionner, je mettrai à jour ce post

fmpwizard
la source

Réponses:

11

Avec le point de départ de la course

sepolgen /path/to/binary

ce qui vous donne:

app.fc
app.sh
app.if
app.spec
app.te

Pour créer un nouveau SELinux file contextfichier à appliquer à un répertoire parent contenant les fichiers que votre programme / démon va modifier, vous modifiez le fichier app.te et ajoutez:

type app_var_t;
files_type(app_var_t)

La première ligne déclare le nouveau type et la deuxième ligne appelle une macro qui fait un peu de magie et en fait un type de fichier (il s'avère que vous ne pouvez pas utiliser une ligne de contexte de processus app_exec_t sur un fichier ou un répertoire), voir "SELinux Types Revisited" pour plus info sur les différents types

Une fois le type déclaré, vous devez indiquer à SELinux que votre application est autorisée à l'utiliser, dans mon cas, j'ai ajouté

allow app_t app_var_t:dir { add_name remove_name write search};
allow app_t app_var_t:file { unlink create open rename write read };

Ces deux lignes disent essentiellement, autoriser le type app_t qui est le domaine de mon application, écrire des répertoires / search / etc avec le contexte app_var_tet lui permettre de créer / ouvrir / supprimer / etc des fichiers avec le contexte app_var_t

La dernière partie du puzzle consiste à dire en quelque sorte à SELinux quel (s) dossier (s) et fichier (s) doivent obtenir chaque type, vous le faites en éditant le app.fcfichier (fc => contexte de fichier)

ce fichier n'a que deux lignes dans mon cas:

/srv/bot/app        --  gen_context(system_u:object_r:app_exec_t,s0)
/srv/bot(/.*)?          gen_context(system_u:object_r:app_var_t,s0)

la première ligne pointe directement vers le binaire tel que déployé sur mes serveurs, donc celui-ci obtient le contexte app_exec_t.

La deuxième ligne signifie:

Appliquez app_var_t au répertoire / srv / bot et également à tous les fichiers du répertoire / srv / bot

Notez comment la première ligne a --entre le chemin d'accès et l'appel à gen_context. --signifie, appliquer cela uniquement aux fichiers. dans le deuxième cas, nous n'avons rien (juste des espaces), ce qui signifie que nous devons appliquer à tous les répertoires et fichiers correspondants, ce que je voulais, une autre option consiste -dà appliquer uniquement les répertoires.

J'ai maintenant une politique qui fonctionne, je peux déployer mon application avec une politique personnalisée et tout fonctionne. (ma politique contient beaucoup plus d'entrées dans le .tefichier, mais elle sort du cadre de cette question.)

Matériel de lecture supplémentaire qui m'a aidé à trouver cette solution:

Rendre les choses plus faciles avec Sepolgen

Réfléchissez avant de simplement aveuglément audit2allow -M mon domaine

SELinux POUR LES DÉVELOPPEURS RED HAT (PDF long)

Un module SElinux (1): types et règles

Exemple de politique (spécialement le postgresql)

Comprendre les fichiers de contextes de fichiers

fmpwizard
la source
Ou utilisez CIL
Jakuje
sepolgen /path/to/binarycrache une erreur de syntaxe pour moi. Je suis sur RHEL 7.6. Je pense que sepolgen --application /path/to/binaryc'est la syntaxe appropriée si votre objectif est d'écrire une politique pour une application particulière ??
jayhendren
Votre .tefichier lance également une erreur de syntaxe pour moi lors de la compilation du module: app.te:5:ERROR 'This block has no require section.' at token 'files_type' on line 5:. Et si j'ajoute une requiresection, j'obtiens:ERROR 'syntax error' at token 'files_type' on line 13:
jayhendren
Désolé, je n'ai plus accès à une machine Fedora pour le tester, mais il se pourrait que depuis la version 24, ils aient changé de syntaxe.
fmpwizard