UID a přístup k souborům


To <czdebian-l zavinac debian bod cz>
From "Jiří Jánský" <xJanskyJ zavinac seznam bod cz>
Date Sun, 7 Dec 2003 16:29:00 +0100

Dobrý den,
u nás ve škole vzniknul požadavek dynamicky rekonfigurovat squid přes webové
rozhraní a mít tak možnost zakázat nebo povolit jednotlivá IP v lokální síti
(respektyvě jeejich přístup k internetu.
    Moja myšlenka byla ta, že pomocí cgi-bin scriptu připojím k normálnímu
squid.conf IP adresy, které mají být povoleny a squid restartuji. A hned na
začátku jsem narazil na problém.
    Zkopíroval jsem soubor /etc/init.d/squid do složky s cgi-bin scripty,
jako vlasníka nastavil root a zapnul suid bit (chmod u+s restart.sh - jestli
ne tak mě opravte). Když jsem se onen script pokusil spustit z příkazové
řádky jako obyčejný uživatel, tak to vypadá, jako že to nemá přístup ke
konfiguračnímu souboru squid.conf, který je povolen číst a zapisovat pouze
pro roota. No ale to by přece tek script mněl mít možnost přečíst, když má
nastavený ten SUID bit.

        Za reakce děkuji    Jiří Jánský


_______________________
přikládám chybové hlášení

jirka zavinac debian:/var/www/proxy$ ./restart.sh restart
Restarting proxy server: ./restart.sh: line 1: /etc/squid.conf: Přístup
odmítnut
./restart.sh: line 59: cd: /var/spool/squid: Přístup odmítnut
FATAL: Unable to open configuration file: /etc/squid.conf: (13) Permission
denied
Squid Cache (Version 2.5.STABLE3): Terminated abnormally.
CPU Usage: 0.010 seconds = 0.010 user + 0.000 sys
Maximum Resident Size: 0 KB
Page faults with physical i/o: 313
./restart.sh: line 123:   663 Neúspěąně ukončen (SIGABRT)
start-stop-daemon --quiet --start --pidfile $PIDFILE --exec $DAEMON --
$SQUID_ARGS </dev/null
squid.


_____________________
a zde "restartovací script

#! /bin/sh
#
# squid  Startup script for the SQUID HTTP proxy-cache.
#
# Version: @(#)squid.rc  2.20  01-Oct-2001  miquels zavinac cistron bod nl
#

NAME=squid
DAEMON=/usr/sbin/squid
LIB=/usr/lib/squid
PIDFILE=/var/run/$NAME.pid
SQUID_ARGS="-D -sYC"

[ ! -f /etc/default/squid ] || . /etc/default/squid

PATH=/bin:/usr/bin:/sbin:/usr/sbin

[ -x $DAEMON ] || exit 0

grepconf2 () {
 w="  " # space tab
 sq=/etc/$NAME.conf
 # sed is cool.
 res=`sed -ne '
  s/^'$1'['"$w"']\+[^'"$w"']\+['"$w"']\+\([^'"$w"']\+\).*$/\1/p;
  t end;
  d;
  :end q' < $sq`
 [ -n "$res" ] || res=$2
 echo "$res"
}

#
# Try to increase the # of filedescriptors we can open.
#
maxfds () {
 [ -n "$SQUID_MAXFD" ] || return
 [ -f /proc/sys/fs/file-max ] || return 0
 [ $SQUID_MAXFD -le 4096 ] || SQUID_MAXFD=4096
 global_file_max=`cat /proc/sys/fs/file-max`
 minimal_file_max=$(($SQUID_MAXFD + 4096))
 if [ "$global_file_max" -lt $minimal_file_max ]
 then
  echo $minimal_file_max > /proc/sys/fs/file-max
 fi
 ulimit -n $SQUID_MAXFD
}

start () {
 cdr=`grepconf2 cache_dir /var/spool/$NAME`
 case "$cdr" in
  [0-9]*)
   echo "squid: squid.conf contains 2.2.5 syntax - not starting!" >&2
   exit 1
   ;;
 esac
 maxfds
 umask 027
 cd $cdr
 start-stop-daemon --quiet --start \
  --pidfile $PIDFILE \
  --exec $DAEMON -- $SQUID_ARGS < /dev/null
 sleep 1
}

stop () {
 PID=`cat $PIDFILE 2>/dev/null`
 start-stop-daemon --stop --quiet --pidfile $PIDFILE --exec $DAEMON
 #
 # Now we have to wait until squid has _really_ stopped.
 #
 sleep 2
 if test -n "$PID" && kill -0 $PID 2>/dev/null
 then
  echo -n "Waiting ."
  cnt=0
  while kill -0 $PID 2>/dev/null
  do
   cnt=`expr $cnt + 1`
   if [ $cnt -gt 60 ]
   then
    #
    # Waited 120 seconds now. Fail.
    #
    echo -n " Failed.. "
    break
   fi
   sleep 2
   echo -n "."
  done
  [ "$1" = verbose ] && echo "done."
 else
  [ "$1" = verbose ] && echo "$NAME."
 fi
}

case "$1" in
    start)
 echo -n "Starting proxy server: "
 start
 echo "$NAME."
 ;;
    stop)
 echo -n "Stopping proxy server: "
 stop verbose
 ;;
    reload|force-reload)
 echo -n "Reloading $NAME configuration files: "
 start-stop-daemon --stop --signal 1 \
  --pidfile $PIDFILE --quiet --exec $DAEMON
 echo "done."
 ;;
    restart)
 echo -n "Restarting proxy server: "
 stop
 start
 echo "$NAME."
 ;;
    *)
 echo "Usage: /etc/init.d/$NAME {start|stop|reload|force-reload|restart}"
 exit 1
 ;;
esac

exit 0



Partial thread listing: