Intendo utilizzare l'utente con privilegi minimi per eseguire una determinata attività. Il problema è che coinvolge una sorta di catena di responsabilità e si traduce come una catena sudo
nei miei script, diffondendo l'attività generale in molti punti.
File Sudoer
"www-data" ALL = (webadmin) NOPASSWD: /home/webadmin/scripts/git-deploy.sh
"webadmin" ALL = (root) NOPASSWD: /root/scripts/copy-deploy ""
Dettagli
Per rendere più tangibile il paragrafo precedente:
Alcune richieste vengono inviate ad Apache.
Il lavoratore è in esecuzione come www-data
Attraverso mod_php, lo script /home/webadmin/scripts/git-deploy.sh
viene lanciato usando
<?php
exec('/'.escapeshellarg($gitRepo))
$gitRepo
è alimentato dallo script seguente:
$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;
}
Naturalmente, lo script /home/webadmin/scripts/git-deploy.sh
controlla $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: so che è solo eco, questa è la versione di prova con utenti fittizi.
Ogni script è solo u+rwx
dal suo proprietario (700).
Domanda
- Sta diffondendo le sceneggiature in vari luoghi giocando contro la sicurezza? (Più difficile capire cosa sta succedendo)
- Vedi qualcos'altro che non va?