Newsgroup: it.comp.os.linux.sys
Titolo: Zentyal samba e acl

Buongiorno a tutti,
ho problemi di permesso con una zentyal che mi fa da file server.
Purtroppo ho passato i file nelle share di rete attraverso un rsync 
ripristinando i permessi a mano a suon di setfacl.
Il risultato è che in modo del tutto casuale il sistema nega l'accesso a 
cartelle e file. 
A volte inoltre sembra che i file restano in stato di lock 
ingiustificatamente impedendo l'accesso.
 
C'è nessuno che si è trovato in una situazione analoga?
 
Grazie

 C'è nessuno che si è trovato in una situazione analoga?
 
Si, a tal punto che ho scriptato un coso che, se necessario, spiana e
sistema le ACL.
 
Il problema spesso è che le ACL non ''combaciano'' con i permessi di use e
gruppo primario, e windows/samba va in fastidio.
 
 
Non mi ricodo come si allega qualcosa con tin... ;-)
 
-- 
  chi si convertiva nel novanta
  ne era dispensato nel novantuno			(F. De Andre`)

 
 
Se pensi mi possa aiutare incollalo qui :-)
 
Per ora sto andando di find e exec per limitare i files processati ma ho due 
problemi: il primo che non sono sicuro che la opzione su find -user funzioni 
a dovere, non mi riconosce il proprietario che ls mi fa vedere a video e la 
seconda che non trovo un modo efficiente per valutare le acl su un visibilio 
di files, find non ha un modo tipo user e va fatto con grep e simili ma è 
uno sfacelo.
Mi trovo pure cartelle con i permessi settati come punti esclamativi e senza 
la possibilità di cambiarli.
 
Umberto
 


#
#                 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
------------------------------- CUT HERE -------------------------------------
 
-- 
  ma l'impresa eccezionale, dammi retta
  e` essere normale					(L. Dalla)