L'autorisation de fichier s'exécute uniquement

12

Comment puis-je définir le fichier pour qu'il soit exécutable uniquement pour d'autres utilisateurs mais pas lisible / inscriptible, la raison pour laquelle j'exécute quelque chose avec mon nom d'utilisateur mais je ne veux pas donner le mot de passe. J'ai essayé :

chmod 777 testfile
chmod a=x
chmod ugo+x

J'obtiens toujours une autorisation refusée lors de l'exécution en tant qu'autre utilisateur.

c0mrade
la source
Qu'en est-il lorsque vous l'exécutez PAS en tant qu'autre utilisateur? Et est-ce un script ou un programme binaire? Les scripts doivent être lus par l'interprète.
psusi
Avez-vous un shebang en haut du fichier? #! / bin / sh
J Baron

Réponses:

10

Vous avez besoin à la fois des autorisations de lecture et d'exécution sur un script pour pouvoir l'exécuter. Si vous ne pouvez pas lire le contenu du script, vous ne pouvez pas non plus l'exécuter.

tony@matrix:~$ ./hello.world
hello world
tony@matrix:~$ ls -l hello.world
-rwxr-xr-x 1 tony tony 17 Jul 13 22:22 hello.world
tony@matrix:~$ chmod 100 hello.world
tony@matrix:~$ ls -l hello.world
---x------ 1 tony tony 17 Jul 13 22:22 hello.world
tony@matrix:~$ ./hello.world
bash: ./hello.world: Permission denied
EightBitTony
la source
En effet, mis à jour pour refléter que c'est vrai pour les scripts qui considérant la question d'origine, c'est ce que je soupçonne être le cas.
EightBitTony
12

Il y a une demi-vérité dans les déclarations précédentes. Vous pouvez configurer un script afin qu'il ne soit pas lisible par l'utilisateur, mais qu'il soit toujours exécutable. Le processus est un peu long, mais il est possible en faisant une exception dans / etc / sudoer afin que l'utilisateur puisse exécuter le script en tant que vous-même temporairement sans être invité à entrer un mot de passe. Exemple ci-dessous:

Un script que je veux partager avec un utilisateur:

me@OB1:~/Desktop/script/$ chmod 700 somescript.pl
me@OB1:~/Desktop/script/$ ls -l somescript.pl
-rwx------ 1 me me 4519 May 16 10:25 somescript.pl

Créez un script shell qui appelle 'somescript.pl' et enregistrez-le dans / bin /:

me@OB1:/bin$ sudo cat somescript.sh
[sudo] password for me: 
#!/bin/bash
sudo -u me /home/me/Desktop/script/somescript.pl $@

ÉTAPE FACULTATIVE Créez un lien symbolique vers somescript.sh dans / bin /:

sudo ln -s /bin/somescript.sh /bin/somescript

Assurez-vous que le script shell est lisible / exécutable pour l'utilisateur (pas d'accès en écriture):

sudo chmod 755 /bin/somescript.sh
me@OB1:/bin$ ls -l somescript*
lrwxrwxrwx 1 root root  14 May 28 16:11 somescript -> /bin/somescript.sh
-rwxr-xr-x 1 root root 184 May 28 18:45 somescript.sh

Faites une exception dans / etc / sudoer en ajoutant ces lignes:

# User alias specification
User_Alias  SCRIPTUSER = me, someusername, anotheruser

# Run script as the user 'me' without asking for password
SCRIPTUSER ALL = (me) NOPASSWD: /home/me/Desktop/script/somescript.pl

PREUVE DANS LE PUDDING:

someuser@OB1:~$ somescript
***You can run me, but can't see my private parts!***

someuser@OB1:~$ cat /home/me/Desktop/script/somescript.pl
cat: /home/me/Desktop/script/somescript.pl: Permission denied

Cette méthode devrait être meilleure que d'essayer de brouiller avec Filter::Cryptoou PAR::Filter::Cryptoou Acme::Bleachqui peut être inversée par un utilisateur déterminé. Il en va de même pour la compilation de votre script en binaire. Faites-moi savoir si vous trouvez quelque chose de mal avec cette méthode. Pour les utilisateurs plus avancés, vous souhaiterez peut-être supprimer complètement la section User_Alias ​​et remplacer SCRIPTUSER par '% groupname'. De cette façon, vous pouvez gérer vos utilisateurs de script avec la usermodcommande.

Santana
la source
6

Si vous laissez d'autres utilisateurs exécuter un programme, ils peuvent alors savoir tout ce que fait le programme, que le fichier du programme soit lisible ou non. Tout ce qu'ils doivent faire, c'est pointer un débogueur (ou un programme de type débogueur tel que strace). Un exécutable binaire peut s'exécuter s'il est exécutable et non lisible (un script ne le peut pas, car l'interpréteur doit pouvoir lire le script), mais cela ne vous donne aucune sécurité.

Si vous voulez que d'autres puissent exécuter votre programme sous forme de boîte noire, sans leur permettre de voir exactement ce que fait le programme, vous devez donner à votre script des privilèges élevés: rendez-le setuid pour votre utilisateur. Seul root peut utiliser des outils de débogage sur les programmes setuid. Notez que l'écriture de programmes setuid sécurisés n'est pas facile, et la plupart des langues ne conviennent pas; voir Autoriser setuid sur les scripts shell pour plus d'explications. Si vous allez écrire un programme setuid, je recommande fortement Perl, qui a un mode (mode taint) qui est explicitement destiné à rendre possible des scripts setuid sécurisés.

Gilles 'SO- arrête d'être méchant'
la source
-1

Vous pouvez définir des autorisations de fichier avec la commande chmod. L'utilisateur root et le propriétaire du fichier peuvent définir des autorisations de fichier. chmod a deux modes, symbolique et numérique.

Tout d'abord, vous décidez si vous définissez des autorisations pour l'utilisateur (u), le groupe (g), les autres (o) ou les trois (a). Ensuite, vous ajoutez une autorisation (+), la supprimez (-) ou effacez les autorisations précédentes et en ajoutez une nouvelle (=). Ensuite, vous décidez si vous définissez l'autorisation de lecture (r), l'autorisation d'écriture (w) ou exécutez l'autorisation (x). Enfin, vous indiquerez à chmod les autorisations de fichier que vous souhaitez modifier.

Voici quelques exemples.

Effacez toutes les autorisations mais ajoutez une autorisation de lecture pour tout le monde:

$ chmod a=r filename

Après la commande, les autorisations du fichier seraient -r - r - r--

Ajoutez des autorisations d'exécution pour le groupe:

$ chmod g+x filename

Maintenant, les autorisations du fichier seraient -r - r-xr--

Ajoutez des autorisations d'écriture et d'exécution pour le propriétaire du fichier. Notez comment vous pouvez définir plusieurs autorisations en même temps:

$ chmod u + wx nom de fichier

Après cela, les autorisations de fichier seront -rwxr-xr--

Supprimez l'autorisation d'exécution du propriétaire et du groupe du fichier. Notez, encore une fois, comment vous pouvez les définir à la fois:

$ chmod ug-x nom de fichier

Maintenant, les autorisations sont -rw-r - r--

Il s'agit d'une référence rapide pour définir les autorisations de fichiers en mode symbolique:

Which user?
u   user/owner
g   group
o   other
a   all
What to do?
+   add this permission
-   remove this permission
=   set exactly this permission
Which permissions?
r   read
w   write
x   execute
J Baron
la source
Il ressort de la question que le PO comprend comment l'utiliser chmod. Cela ne répond pas à la question.
Scott