[Samba-it] Samba 4 perde i permessi dei file
Marco Gaiarin
gaio at sv.lnf.it
Tue May 5 05:02:49 MDT 2015
Mandi! Mario Vittorio Guenzi
In chel di` si favelave...
> In modo assolutamente randomico nelle subdir che sono sharate dei files
> perdono i permessi, tipicamente dopo essere stati aperti per modifiche,
> o meglio se faccio getfacl sui files mi dice che sono a posto, se
> invece li controllo da windows mi dice che nessuno e' proprietario di
> quel file.
Da che samba provieni? Io sono ancora su wheezy/samba3, ma ricordo
problemi simili in cui sono incappato in qualche aggiornamento.
Io ora ho per gli share:
nt acl support = yes
inherit acls = yes
inherit permissions = yes
map acl inherit = yes
map archive = no
map hidden = no
map system = no
store dos attributes = yes
dos filemode = yes
create mask = 0774
e se non ricordo male il problema è dovuto a una non corretta
impostazione delle ACL (che, ti rammento, sono sempre un ''mapping''
tra quelle POSIX e quelle windows).
Oltre a questo, mi sono anche fatto uno script (in linux, quindi uso
setfacl/setfattr) che alla bisogna ''resetta'' le ACL, in particolare
setta correttamente le ACL di default *E*, fondamentale, setta i
permessi UNIX di gruppo che fungono da maschera.
Lo allego, ovviamnete usalo cum grano salis... ;-)))
--
dott. Marco Gaiarin GNUPG Key ID: 240A3D66
Associazione ``La Nostra Famiglia'' http://www.sv.lnf.it/
Polo FVG - Via della Bontà, 7 - 33078 - San Vito al Tagliamento (PN)
marco.gaiarin(at)lanostrafamiglia.it t +39-0434-842711 f +39-0434-842797
Dona il 5 PER MILLE a LA NOSTRA FAMIGLIA!
http://www.lanostrafamiglia.it/25/index.php/component/k2/item/123
(cf 00307430132, categoria ONLUS oppure RICERCA SANITARIA)
-------------- parte successiva --------------
#!/bin/bash
#
# This code was developed by Marco Gaiarin <gaio a sv.lnf.it>
#
# Copyright (C) 2010 Marco Gaiarin
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
# USA.
# Purpose of fixacl: fix the ACL permission on a share, enforcing that
# 'primary' user and group of the folder got correctly propagated
# on ACLs.
#
# CHANGELOG
# (Fri Apr 23 18:28:20 CEST 2010)
# + prima versione
# (Wed Apr 28 16:04:09 CEST 2010)
# + reimposto anche le ACL su '::', ovvero quelle POSIX, che sembrano non
# restare allineate...
# (Fri Mar 11 12:18:46 CET 2011)
# + i permessi sul gruppo non possono essere restrittivi, forzo un relax.
# vedi il thread http://lists.xsec.it/pipermail/samba-it/2011-March/008544.html
# + già che ci sono, verifico e piallo o permesso a ''other''
# + elimino l'aggiunta della ACL default per l'utente, è una forzatura che non ha senso.
# (Wed Apr 27 09:36:50 CEST 2011)
# + sistemato baco sull'escaping, anche qui è meglio usare un ''while read''.
# + altre sistemazioni varie qui e li, in particolare uso sempre il path full.
# (Wed Apr 18 16:17:55 CEST 2012)
# + aggiunte le opzioni per il nuke, per estendere le ACL a piacere e per bloccare
# la ricorsione. Eseguire con '-h' per vedere le opzioni.
# + aggiunto il file di configurazione /etc/samba/fixacl.conf
# (Thu May 3 15:01:43 CEST 2012)
# + considero il bit suid (rws) nelle directory.
# (Mon Nov 12 12:27:07 CET 2012)
# + aia, che sbadato... l'opzione di nuke non veniva passata alle sottocartelle, sistemato.
# (Mon Jan 21 11:30:45 CET 2013)
# + fico, il test '-d' torna vero anche se è un link, aggiunto un ulteriore controllo
# sulla ricorsione.
# + aggiunta la verifica e l'eliminazione dei permessi speciali UNIX (flags).
# Qualche variabile... qui definisco i default, a cui posso fare override con il
# file di configurazione definito.
#
SETFACL="/usr/bin/setfacl"
GETFACL="/usr/bin/getfacl -p"
SETFATTR="/usr/bin/setfattr"
CHMOD="/bin/chmod"
CONF="/etc/samba/fixacl.conf"
# Per evitare errori, limito la possibilità di eseguire questo script a
# un particolare path e profondità.
BASE="/srv" # path base necessario per poter eseguire lo script
LVL=3 # Minimo numero di componenti della directory necessarie
# In aggiunta alla sistemazione delle ACL di base, prelevate dai permessi UNIX,
# posso essere interessato a forzare delle ACL specifiche.
OACL="group:ced:rwx" # ACL da forzare, delimitate da spazi
# Override, se esiste.
if [ -f "$CONF" ]; then
. $CONF
fi
# Parsing della commandline.
# Gruppi e utenti sono nel formato unix senza spazi.
#
NUKE=false
RECURSIVE=true
PERMS=""
while true; do
case "$1" in
-h | --help ) echo "$0: script per la sistemazione dei permessi estesi (ACL) su disco";
echo "Utilizzo: $0 [-h|--help] [-n|--nuke] [-p|--perms <permessi>] [-r|--norecursive] <cartella>";
echo " Dove: --nuke: forza l'azzeramento e il ripristino delle ACL";
echo " --perms <permessi>: elenco separato da virgola dei permessi di gruppo aggiuntivi";
echo " nella forma <tipo>:<elemento>:<permesso>, da aggiungere a $OACL";
echo " --norecursive: disabilita la ricorsione, opera solo sulla cartella corrente e i suoi file";
echo " <cartella> è una cartella, che deve fare base in $BASE e avere almeno $LVL livelli";
exit 0;
shift;;
-n | --nuke ) NUKE=true; shift;;
-r | --norecursive ) RECURSIVE=false; shift;;
-p | --perms ) PERMS="$2"; shift 2;;
-- ) shift; break ;;
* ) break ;;
esac
done
# Aggiungo alle ACL di base quelle eventualmente fornite in commandline.
#
OACL="$OACL $(echo $PERMS | tr -s ',' ' ')"
# Controllino standard.
#
if [ ! -x "$SETFACL" ] || [ ! -x "$SETFATTR" ]; then
echo "Mancano i programmi $SETFACL e/o $SETFATTR, non posso operare"
exit 0
fi
# Smandruppo il path fornito in commandline, lo sanitizzo.
# Se non è indicato, esco bene.
#
OBJ=$1
if [ -z "$OBJ" ]; then
echo "Occorre indicare una cartella (-h per le opzioni)."
exit 0
fi
OBJ=$(echo "$OBJ" | tr -s /)
if [ "$OBJ" == "." ]; then
OBJ=$(pwd)
fi
echo "$OBJ" | grep "^/" &> /dev/null
if [ $? -ne 0 ]; then
OBJ="$(pwd)/${OBJ}"
fi
echo "$OBJ" | grep "/$" &> /dev/null
if [ $? -eq 0 ]; then
OBJ=$(echo "$OBJ" | sed -e 's?/$??1')
fi
# Verifico che esista e che abbia le caratteristiche indicate.
#
if [ ! -d "$OBJ" ]; then
echo "La directory indicata non esiste (-h per le opzioni)."
exit 0
fi
echo "$OBJ" | grep "^$BASE" &> /dev/null
b=$?
c=$(echo "$OBJ" | tr -c -d / | wc -c)
if [ $b -ne 0 ] || [ $c -lt $LVL ]; then
echo "Il path indicato non fa base in $BASE e non ha almeno $LVL sottocartelle (-h per le opzioni)."
exit 0
fi
# Determino i permessi di base (UNIX) della cartella. Lo faccio a partire
# da 'getfacl', e determino anche eventuali flags (permessi speciali UNIX).
#
U=$($GETFACL "$OBJ" | tr -d ' ' | grep "^#owner:" | cut -d ':' -f 2)
G=$($GETFACL "$OBJ" | tr -d ' ' | grep "^#group:" | cut -d ':' -f 2)
F=$($GETFACL "$OBJ" | tr -d ' ' | grep "^#flags:" | cut -d ':' -f 2)
UP=$($GETFACL "$OBJ" | grep "^user::" | cut -d ':' -f 3)
GP=$($GETFACL "$OBJ" | grep "^group::" | cut -d ':' -f 3)
OP=$($GETFACL "$OBJ" | grep "^other::" | cut -d ':' -f 3)
# Per applicare le ACL sui gruppi è necessario che i permessi
# sul gruppo UNIX non siano ristretti, perchè sono usati come maschera
# per l'applicazione delle ACL.
# L'alternativa sarebbe quella di settare esplicitamente una maschera, ma
# per come è impostato il modello di security di sicuro c'è almeno un gruppo
# che ha permessi full control sulla cartella.
# Parimenti, verifico che i permessi per ''other'' siano a zero, altrimenti
# li piallo. Ed elimino eventuali permessi speciali.
# E stampo dei warning.
#
if [ "$GP" != "rwx" ]; then
echo "La cartella $OBJ ha dei permessi di gruppo restrittivi, li rilasso."
GP="rwx"
fi
if [ "$OP" != "---" ]; then
echo "La cartella $OBJ ha dei permessi per ''other'' (Everyone), li elimino."
OP="---"
fi
if [ "$F" != "" ]; then
echo "La cartella $OBJ ha dei flags (permessi speciali UNIX), li elimino."
$CHMOD a-st "$OBJ"
fi
# Sistemo le ACL della cartella corrente.
#
if [ "$NUKE" == "true" ]; then
$SETFATTR -x system.posix_acl_access "$OBJ"
$SETFATTR -x system.posix_acl_default "$OBJ"
fi
$SETFACL -m user::$UP "$OBJ"
$SETFACL -m group::$GP "$OBJ"
$SETFACL -m other::$OP "$OBJ"
$SETFACL -m user:$U:$UP "$OBJ"
$SETFACL -m group:$G:$GP "$OBJ"
$SETFACL -d -m group::$GP "$OBJ"
$SETFACL -d -m other::$OP "$OBJ"
$SETFACL -d -m group:$G:$GP "$OBJ"
for a in $OACL; do
$SETFACL -m $a "$OBJ"
$SETFACL -d -m $a "$OBJ"
done
# OK, adesso ciclo tra tutti i file e cartelle contenute, richiamando
# ricorsivamente lo script.
# Uso un ciclo 'while read' per evitare ogni possibile problema di escaping.
#
ls "$OBJ" | while read o; do
# Se è un file, forzo le ACL della cartella che lo contiene.
# Notare che, a parte ''other'', aggiungo AC specifiche, non
# tocco quelle POSIX, ed eventualmente non tocco i flags.
#
if [ -f "$OBJ/$o" ]; then
if [ "$NUKE" == "true" ]; then
$SETFATTR -x system.posix_acl_access "$OBJ/$o"
fi
$SETFACL -m user:$U:$UP "$OBJ/$o"
$SETFACL -m group:$G:$GP "$OBJ/$o"
$SETFACL -m other::$OP "$OBJ/$o"
for a in $OACL; do
$SETFACL -m $a "$OBJ/$o"
done
fi
# Se è una cartella, non è un link e la ricorsione è abilitata, richiamo ricorsivamente lo script.
#
if [ -d "$OBJ/$o" ] && [ ! -L "$OBJ/$o" ] && [ "$RECURSIVE" == "true" ]; then
CMDL=""
if [ "$NUKE" == "true" ]; then
CMDL="$CMDL -n"
fi
if [ ! -z "$PERMS" ]; then
CMDL="$CMDL -p $PERMS"
fi
$0 $CMDL "$OBJ/$o"
fi
done
More information about the samba-it
mailing list