Tengo la intención de usar el usuario con menos privilegios para realizar una tarea determinada. El problema es que involucra un tipo de cadena de responsabilidad y se traduce como una cadena sudo
en mis scripts, distribuyendo la tarea general en muchos lugares.
archivo de Sudoer
"www-data" ALL = (webadmin) NOPASSWD: /home/webadmin/scripts/git-deploy.sh
"webadmin" ALL = (root) NOPASSWD: /root/scripts/copy-deploy ""
Detalles
Para hacer más tangible el párrafo anterior:
Alguna solicitud es enviada a Apache.
El trabajador se ejecuta como www-data
A través de mod_php, el script /home/webadmin/scripts/git-deploy.sh
se inicia utilizando
<?php
exec('/'.escapeshellarg($gitRepo))
$gitRepo
se alimenta de la siguiente secuencia de comandos:
$bitBucketUrl=json_decode($request->getContent(),true);
if(isset($bitBucketUrl['url'])){
$bitBucketUrl=$bitBucketUrl['url'];
if(!preg_match('/\.git$/',$bitBucketUrl)){
$bitBucketUrl.='.git';
}
}else{
$result='bad url';
}
if(preg_match('/^[email protected]:TEAM\/[a-zA-Z0-9\.-]+\.git$/',$bitBucketUrl)){
exec(escapeshellcmd('sudo -u webadmin /home/webadmin/scripts/git-deploy.sh '.escapeshellarg($bitBucketUrl)),$results);
$result=$results;
}else{
$result=$bitBucketUrl;
}
Por supuesto, el script /home/webadmin/scripts/git-deploy.sh
check $1
#!/bin/bash
valid=^[email protected]:TEAM/[a-zA-Z0-9-]+\.git$
if [[ $1 =~ $valid ]]; then
name=${1#[email protected]:TEAM/}
name=${name%.git}
fullName=/home/webadmin/websites/$name
if [[ -e $fullName ]] ; then
echo "$fullName exists, will do a git pull instead"
echo "cd $fullName && git pull"
else
echo "/usr/bin/git clone $1"
fi
if [[ -e $fullName/deploy/apache-conf/ ]]; then
#sudo -u root /root/scripts/copy-deploy
fi
fi
Nota: Sé que solo se está haciendo eco, esta es la versión de prueba con usuarios ficticios.
Cada secuencia de comandos solo es u+rwx
por su propietario (700).
Pregunta
- ¿La distribución de los scripts en varios lugares juega en contra de la seguridad? (Más difícil de entender lo que está pasando)
- ¿Ves algo más mal?