[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