Archivo de la Categoría “Radio Ranchito”


Bueno, después de haber hecho el articulo de “Chrooting SHOUTcast“, he decido publicar el script de inicio que uso para ejecutar el servicio, este se divide en dos archivos, uno sobre /etc/init.d/shoutcast y otro en /usr/sbin/shoutcast

/usr/sbin/shoutcast:

#!/bin/sh
#SHOUTcast Server 0.1 by RwZ
#For SHOUTcast Server

# Directorio de enjaulamiento
SHOUTJAIL=/shoutjail

# Directorio de configuración dentro de la jaula
SHOUTCONF=/etc/shoutcast

# Usuario no privilegiado con el que se ejecuta
SHOUTUSER=shoutcast

if [ "$UID" -ne 0 ];
then
        if [ "$UID" -ne 0 ];
        then
                echo "You must be root to run this script"
                exit 64
        fi
fi

check_pid ()
{
        if [ -e /var/run/sc_$1.pid ]
        then
                PID=`cat /var/run/sc_$1.pid`
        else
                PID=0
        fi
}

make_pid()
{
        PID=`pidof -s sc_serv`
        echo $PID > /var/run/sc_$1.pid
}

noconf ()
{
        echo ""
        echo "Wrong config file"
        echo "Please specify a filename"
        echo "-h|--help for usage"
        echo ""
        exit 68
}

start ()
{
        start-stop-daemon --start --background --nicelevel -20 \
        --exec=/usr/sbin/chroot -- $SHOUTJAIL /bin/sudo -b -u \
        shoutcast /bin/sc_serv $SHOUTCONF/$1.conf

        make_pid $1
        check_pid $1

        if [ $PID -ne 0 ]
        then
                echo ""
                echo "Shoutcast server running with conf: "$1
                echo ""
        else
                echo ""
                echo "ERROR Shoutcast server failed to start"
                echo ""
                exit 66
        fi
}

stop ()
{
        check_pid $1

        if [ $PID -ne 0 ]
        then
                kill $PID
                echo ""
                echo "Shoutcast server killed with conf: "$1" and PID: "$PID" Stopped."
                echo ""
                rm /var/run/sc_$1.pid
        else
                echo ""
                echo "ERROR Shoutcast server with conf: "$1" Not Running."
                echo ""
                exit 67
        fi
}

case $1 in
-h|--help)
        echo ""
        echo "Shoutcast script by RwZ"
        echo "       start [config file]"
        echo "       stop [config file]"
        echo "       restart [config file]"
        echo "       status [config file]"
        echo ""
        ;;
start)
        check_pid $2

        if [ $PID -ne 0 ]
        then
                echo ""
                echo "Shoutcast server is already running with PID: " $PID
                echo ""
                exit 70
        else
                start $2
        fi
        ;;
stop)
        stop $2
        ;;
restart)
        stop $2
        start $2
        ;;
status)
        check_pid $2

        if [ $PID -ne 0 ]
        then
                echo ""
                echo "Shoutcast server with config file: "$2" Running with PID: "$PID
                echo ""
        else
                echo ""
                echo "Shoutcast server with config file: "$2" Not Running"
                echo ""
        fi
        ;;

* )
        echo ""
        echo "Invalid Argument $1"
        echo "-h|--help for usage"
        echo ""
        exit 69
        ;;
esac
exit 0

/etc/init.d/shoutcast

#!/bin/sh
#SHOUTcast script 0.1 by RwZ
#For SHOUTcast server

#Path to ranchito script
SHOUTSCRIPT=/usr/sbin/shoutcast

case $1 in
        start)
                $SHOUTSCRIPT start config
        ;;
        stop)
                $SHOUTSCRIPT stop config
        ;;
        restart)
                $SHOUTSCRIPT restart config
        ;;
        status)
                $SHOUTSCRIPT status config
        ;;
        *)
                echo "Error"
        ;;
esac
exit 0

Para activarlo en una distribución Ubuntu

update-rc.d shoutcast defaults 99

Este script es muy basico, puede mejorarse, si ese es el caso y deseas compartirlo, no dudes en dejar un comentario.

Comments No Hay Comentarios »

Con la salida de Radio Ranchito (http://radio.zombies.com.mx) y el nuevo servidor Zombie “Avalon”, se vio la necesidad de instalar el servicio de SHOUTcast con algo de seguridad, para lo cual se uso la técnica de enjaulamiento (chroot) y como ejecutarlo con privilegios de mortal.

No soy muy bueno escribiendo manuales, así que pondré solamente la lista de comandos en orden y algunos comentarios sencillos de que es lo que hace.

# Agregamos un usuario que ejecute el servicio.

useradd whatever

# Creamos una nueva estructura de raiz

mkdir -p /shoutjail/{bin,etc,lib,usr,var,tmp,dev}
mkdir -p /shoutjail/etc/shoutcast

# Para evitar que poner dobles archivos.

ln -s /shoutjail/bin /shoutjail/usr/bin
ln -s /shoutjail/lib /shoutjail/usr/lib

# Permisos

chown -R root.root /shoutjail
chmod -R 0755 /shoutjail
chmod 1777 /shoutjail/tmp

# Ahora necesitamos que el usuario con el que se ejecutará el servicio pueda ejecutar chroot sin tener que usar password de root, así que para esto agregaremos una linea en el archivo /etc/sudoers con el comando “visudo”, la cual permitira al usuario ejecutar chroot y solo chroot.

visudo

# Dentro de /etc/sudoers

whatever ALL=NOPASSWD: /usr/sbin/chroot

# Librerias que usa el servicio shoutcast

ldd sc_serv

# Mas archivos utilizados por la aplicación.

strace -o sc_serv.strace -v -f -r -e trace=open -tt ./sc_serv

# La siguiente linea también se puede emplear con “fgrep -i open sc_serv.strace” para mostrar todos los archivos a los que accesa la aplicación.

fgrep \.so sc_serv.strace

# Agregamos el binario de sudo al jail pero sin la función de PAM, para esto descargamos el paquete y lo compilamos.

http://www.sudo.ws/sudo/dist/sudo.tar.gz
./configure
make
cp sudo /shoutjail/bin/sudo

# Librerias necesarias para “sudo”

ldd /shoutjail/bin/sudo

# Mas archivos.

strace -o sudo.strace -v -f -r -e trace=open -tt ./sudo -u whatever /bin/bash
fgrep \.so sudo.strace

# Con la siguiente lista de librerias es suficiente para ejecutar el comando “sudo”, si estas librerias faltan, al ejecutar sudo mostrara que no hay ningun usuario con UID 0 o algo así.

cp /lib/libnss_files.so.2 /shoutjail/lib/
cp /lib/libnss_compat.so.2 /shoutjail/lib/
cp /lib/libnss_nis.so.2 /shoutjail/lib/

# sudoers File

cp /etc/sudoers /shoutjail/etc/sudoers

# Solo dejamos en el archivo.

root    ALL=(ALL) ALL

# Copiamos /etc/passwd a /shoutjail/etc/passwd donde solo dejamos el usuario y root para ejecutar el servicio.

root:x:0:0:root
whatever:x:100:100:whatever:/home/whatever:/bin/bash

# Creamos /dev/nul

mknod null c 1 3

# Iniciando el servicio

# Ya sea como root

chroot /shoutjail /bin/sudo -u whatever bin/sc_serv /etc/sc_serv.conf

# O usuario mortal whatever.

sudo chroot /shoutjail /bin/sudo -u whatever bin/sc_serv /etc/sc_serv.conf

# Por ahi me encontre unos comandos para copiar las librerias necesrias de un archivo ejecutable, pero no las implemente, de cualquier forma las dejo para que lo prueben.

ldd /bin/su | awk '{ print $3; }' | sed 's/\(\/.*\/\(.*\)\)/\1 \2/g' - | xargs -l1 --no-run-if-empty cp

Bueno, con esto será suficiente para enjaular el servicio de SHOUTcast y con acceso de mortal. Si existe alguna duda, comentario, sugerencia, aclaración, no dudes en hacerla llegar mediante el sistema comentarios y así yo implementarla en esta mini-guia.

Comments 2 Comentarios »