Comment définir umask pour un dossier spécifique

23

Pour des raisons évidentes, je dois définir la umaskvaleur d'un dossier spécifique. Comment faire ça?

Merci d'avance!

MISE À JOUR 1

La raison pour laquelle j'ai besoin d'utiliser umask pour un dossier spécifique est la suivante. J'ai une application Web et lorsqu'elle crée un fichier, l'autorisation par défaut est 700. Mais j'ai besoin d'au moins 755 autorisations pour ce fichier. Je pense que je pourrais expliquer le problème plus clairement maintenant.

Bakhtiyor
la source
1
Les raisons peuvent être évidentes pour vous, mais pas pour nous. Veuillez partager ce que vous voulez faire.
htorque
@htorque. Ajout de la raison pour laquelle je dois utiliser umask dans mon problème spécifique.
Bakhtiyor

Réponses:

30

tu pourrais utiliser setfacl

setfacl -d -m group:name:rwx /path/to/your/dir

nameest le nom du groupe

Pour trouver les groupes auxquels vous ou un utilisateur spécifique appartenez, voir sous Unix / linux comment savoir dans quel groupe se trouve un utilisateur donné via la ligne de commande?

yogi70
la source
1
Peut-être setfacla changé. Je reçois une erreur indiquant que ce -mn'est pas une option valide.
Ryan Burnette
Ryan, setfacln'est pas changé. Vous n'avez probablement pas fourni le nom de groupe approprié (après -m).
sergk
1
setfaclest sûr pour les listes de contrôle d'accès et non umask. Une meilleure solution mais pas vraiment ce qui a été demandé, je ne pense pas.
Wyatt8740
essayez: sudo setfacl -Rdm ...(Omettez le R pour la récursivité) devrait fonctionner. @ Wyatt8740 (correct). Pour être certain, exécutez: man setfaclet tapez /-modify. Vous devez utiliser sudo.
JREAM
11

Vous ne pouvez pas définir umask par répertoire, c'est une valeur au niveau du processus. Si vous devez empêcher d'autres personnes de lire des fichiers dans un répertoire, révoquez les bits d'autorisation correspondants.

Par exemple, si vous avez un répertoire /home/user/directoryavec des fichiers et des répertoires qui peuvent obtenir des autorisations comme 777 à partir d'un processus, définissez les bits d'autorisation de /home/user/directoryquelque chose comme 700. Cela rendra impossible pour les autres utilisateurs (à l'exclusion de la racine du superutilisateur) de descendre dans /home/user/directory.

Je suis paranoïaque et je définis les autorisations sur /home/user750, donc seulement je peux lire, écrire et descendre dans mon répertoire personnel. Cela a pour conséquence que les dossiers comme /home/user/Publicne sont pas accessibles aux autres, mais je peux vivre avec ça.


Par mise à jour de votre question: vous ne pouvez toujours pas contrôler que dans le système de fichiers (autre que l'utilisation d'un type de système de fichiers différent comme FAT qui est fortement déconseillé), vous devez le faire dans votre application Web. Si votre webapp est codée en PHP, vous pouvez changer le umask à la volée en utilisant la umaskfonction:

<?php
umask(0022);
// other code
?>

Vous pouvez le mettre dans un fichier de configuration, comme le fichier contenant le mot de passe de connexion à la base de données (en pensant dans des applications comme Wordpress).

N'oubliez pas qu'il s'agit d'une valeur de processus, certains serveurs Web vous permettent de la définir dans leurs fichiers de configuration, sinon vous pouvez modifier les scripts de démarrage pour définir le umask souhaité. N'oubliez pas que les autorisations aiment 755et 644sont assez dangereuses pour les applications Web, si le code est sensible, tout le monde peut le lire.

Lekensteyn
la source
Je sais que c'est ancien, mais je pense qu'il vaut la peine de le mentionner: l'administrateur peut lier mount /home/user/Public( mount -o bind /home/user/Public /some/other/place) pour contourner le problème des autorisations du répertoire parent.
Adrian Günter
1

Pour modifier les autorisations d'un dossier, utilisez chmod. umask est destiné aux fichiers.

Réglez umask sur ce dont vous avez besoin

umask xxx

et changez quand vous avez terminé

umask 022
wojox
la source
11
umask = fichiers et répertoires, fmask = uniquement les fichiers, dmask = uniquement les répertoires. : P
htorque
1
J'ai appris quelque chose de nouveau aujourd'hui :)
wojox
1
En fait, ce sont des options pour certains systèmes de fichiers comme NTFS (pas cette commande de réglage du masque de création de fichiers umask). Désolé d'avoir ajouté des informations déroutantes.
htorque
umask change le masque de création de fichiers pour le processus en cours (le shell actuel), si vous avez un autre shell ouvert ou un processus appartenant à l'utilisateur, je ne pense pas qu'il sera affecté. Cette commande affectera également tous les autres fichiers créés en dehors du répertoire jusqu'à ce que vous le changiez à nouveau.
Dave
1

Une autre solution pourrait être de simplement définir l'ID de groupe sur les fichiers créés dans le répertoire, ce qui fait que les nouveaux fichiers appartiennent à l'ID de groupe du répertoire, au lieu de l'ID de groupe de l'utilisateur qui a créé les fichiers. Je pense donc que vous pourriez simplement faire:

chown www-data:www-data /my/folder

chmod 4755 /my/folder

Cela définit l'autorisation de fichier spécial setgid, ce qui entraînerait la /my/folderpropriété de tous les fichiers créés dans le www-datagroupe, qui dispose alors de l'autorisation rx (5) en raison du répertoire parent.

Bastiaan
la source
2
Vous avez confondu le GUID avec la valeur octale du SUID
adampski
1

Fournir une solution d'anthère implémentée avec des crochets de coque et direnv. La solution suivante peut être plus compatible au cas où elle setfaclne serait pas disponible sur votre système. (par exemple macOS)

direnvest un sélecteur d'environnement pour le shell. Il sait comment se connecter à bash, zsh, tcsh, fish shell et elfish pour charger ou décharger des variables d'environnement en fonction du répertoire courant .

Utilisez .envrcla exportcommande umaskvaleur pour dir spécifique et le exportvar env é sera déchargé lorsque vous quittez ce répertoire.

# example .envrc file
export UMASK=0022

Définissez un hook pour modifier la umaskvaleur une fois le répertoire de travail modifié.

function _umask_hook {
  if [[ -n $UMASK ]]; then
    umask "$UMASK"
  elif [[ $OSTYPE == darwin* ]]; then
    umask 0077
  else
    umask 0022
  fi
}

# To make the code more reliable on detecting the default umask
function _umask_hook {
  # Record the default umask value on the 1st run
  [[ -z $DEFAULT_UMASK ]] && export DEFAULT_UMASK="$(builtin umask)"

  if [[ -n $UMASK ]]; then
    umask "$UMASK"
  else
    umask "$DEFAULT_UMASK"
  fi
}

# zsh hooks
# trigger _umask_hook once working dir is changed
add-zsh-hook chpwd _umask_hook

# bash
# Append `;` if PROMPT_COMMAND is not empty
PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND;}_umask_hook"

Pour l'instant, l'initialisation du hook direnv pour zsh ne prend pas en charge le chpwdhook. Si la demande d'extraction GH-514 n'a pas été fusionnée lorsque vous voyez cette page. S'il vous plaît commenter eval "$(direnv hook zsh)"et accrochez - direnvle chpwdmanuellement à l' aide du code ci - dessous,

if (( $+commands[direnv] )) && ! (( $+functions[_direnv_hook] )); then
  _direnv_hook() {
    eval "$(command "direnv" export zsh)";
  }
  typeset -agU precmd_functions;
  if [[ -z ${precmd_functions[(r)_direnv_hook]} ]]; then
    precmd_functions=( _direnv_hook ${precmd_functions[@]} )
  fi

  typeset -agU chpwd_functions;
  if [[ -z ${chpwd_functions[(r)_direnv_hook]} ]]; then
    chpwd_functions=( _direnv_hook ${chpwd_functions[@]} )
  fi
fi

Source: dynamic-umask-based-on-cwd.md

Simba
la source
0

Associé, mais peut-être pas applicable dans ce cas, le clip suivant provient de .zshrc:

# Change the umask automatically for some directories; use 0022 as the default
chpwd () {
    case $PWD in
        $HOME/[Dd]ocuments*)
            if [[ $(umask) -ne 077 ]]; then
                umask 0077
                echo -e "\033[01;32mumask: private \033[m"
            fi;;
        */[Ww]eb*)
            if [[ $(umask) -ne 072 ]]; then
                umask 0072
                echo -e "\033[01;33mumask: other readable \033[m"
            fi;;
        /vol/nothing)
            if [[ $(umask) -ne 002 ]]; then
                umask 0002
                echo -e "\033[01;35mumask: group writable \033[m"
            fi;;
        *)
            if [[ $(umask) -ne 022 ]]; then
                umask 0022
                echo -e "\033[01;31mumask: world readable \033[m"
            fi;;
    esac
}

Donc, pour une utilisation interactive, quelque chose comme ça fonctionnerait (mais, évidemment, pas pour assurer la sécurité).

Ville
la source