{ }
menu zespół linki Logowanie
Stabilny hosting
BSDGuru zawdzięcza
firmie Datanet.pl
Hosting BSDGuru.org - DataNet.pl

CVS w chroot

0. Wprowadzenie

Trudno wyobrazić sobie życie (programisty, administratora, szefa projektu - niepotrzebne skreślić) bez repozytorium CVS. Ponieważ jednakże, domyślne mechanizmy autoryzacji CVSa do najbezpieczniejszych nie należą, zatem warto jakoś zabezpieczyć dane przechowywane w repozytorium. Jedną z możliwości jest "schowanie" CVSa do chroota. Oto małe HOWTO.

1. Zaczynamy

Na początek musimy wyznaczyć sobie odpowiednią ilość miejsca na dysku. Oraz warto umiejscowić całe repozytorium zgodnie z filozofią hierarchii (man hier). Dlatego też wybrałem katalog
CVSCHRROTCVS=/var/chroot/cvs.

Zatem po wykonaniu katalogu, musimy wykonać małą kopię systemu. W
tym celu wykonujemy polecenia:

mkdir -p ${CHROOTCVS}
cd ${CHROOTCVS}

mkdir -p bin dev etc home lib libexec sbin tmp var/run
[ -e usr ] || ( ln -sf . usr; )

chmod 0555 home/
chmod 1777 tmp/

Następnie należy zapełnić tak utworzoną strukturę:

# --- sprawdzenie pliku ld-elf.so.1 ---------------------------------------
#
[ -f ${CHROOTCVS}/libexec/ld-elf.so.1 ] \
&& ( ${CHFLAGSCMD} noschg ${CHROOTCVS}/libexec/ld-elf.so.1; )

# --- kopiowanie wybranych plik/ow do chroot'a ----------------------------
#
cd ${CHROOTCVS}
cp -p /bin/sh /usr/bin/cvs /usr/bin/passwd bin/
cp -p /sbin/nologin ${PWD_MKDB} sbin/
cp -p /usr/libexec/ld-elf.so.1 /usr/libexec/ld.so libexec/

# --- skopiowanie odpowiednich bibliotek wsp/o/ldzelonych -----------------
#
cd ${CHROOTCVS}
cp `${LDD} bin/* sbin/* | ${AWK} '{print $3}'` lib/

Jeszcze tylko kilka plików specjalnych...

# --- utworzenie urz/adze/n -----------------------------------------------
#
cd ${CHROOTCVS}/dev/
/bin/sh /dev/MAKEDEV std pty0

I przygotowania można uznać za wstępnie ukończone...

2. Usersi

Natępnym ważnym krokiem jest wykonanie lokalnej bazy grup oraz
użytkowników. W tym celu kopiujemy potrzebne dane:

# --- users/groups w chroot -----------------------------------------------
#
cd ${CHROOTCVS}
${GREP} -e '^(wheel|nobody|nogroup|kmem|cvs)' /etc/group > etc/group
${GREP} -e '^(root|nobody|cvs)' /etc/master.passwd > etc/master.passwd

# --- zbudowanie baz hase/l -----------------------------------------------
#
${PWD_MKDB} -d ${CHROOTCVS}/etc etc/master.passwd
${PWD_MKDB} -d ${CHROOTCVS}/etc -p etc/master.passwd

# --- sprawdzamy, czy w CHROOT jest grupa oraz u/zytkownik CVSowy ---------
#
if [ "`${PWCMD} -V ${CHROOTCVS}/etc group show ${CVSGID}`" = "" ]; then
${PWCMD} -V ${CHROOTCVS}/etc group add ${CVSGRP} -g ${CVSGID}
fi

if [ "`${PWCMD} -V ${CHROOTCVS}/etc user show ${CVSUID}`" = "" ]; then
${PWCMD} -V ${CHROOTCVS}/etc user add ${CVSUSR} -g ${CVSGID} \
-u ${CVSUID} -s /sbin/nologin -c "CVSmaster" -d /home/${CVSUSR}
fi

Jak widać na potrzeby repozytrium powstał specjalny użytkownik
CVSmaster".

3. Kolej na polecenia CVSa

Skoro jest już przygotowane środowisko, można zatem zabrać się za
wykonywanie właściwego repozytorium CVSa. W tym celu wykonujemy polecenia (po
szczegóły odsyłam do man cvs):

# --- teraz zbudowanie repozytorium ---------------------------------------
#
${CVSCMD} -d ${CHROOTCVS}/cvsroot init

# --- ustawienie uprawnie/n -----------------------------------------------
#
chmod 0777 ${CHROOTCVS}/cvsroot/CVSROOT
${CHOWNCMD} -R ${CVSUID}:${CVSGID} ${CHROOTCVS}/cvsroot/

Takie wykonanie ustawień katalogu specjalnego CVSROOT pozwoli na zapisywanie zmian w poszczególnych projektach. Aby poprawić nieco uprawnienia (zabrać możliwość pisania dla wszystkich), należy nieco popawić pliki konfiguracyjne utworzonego repozytorium. W tym celu należy wykonać:

$ cd /tmp/
$ cvs -d ${CHROOTCVS}/cvsroot co CVSROOT
$ cd CVSROOT
$ vi config (ustawić LockDir na /var/lock/cvs)
$ cvs commit -m'rekonf'
$ mkdir -p ${CHROOTCVS}/var/lock/cvs
$ chmod 1777 ${CHROOTCVS}/var/lock/cvs

4. Całość podpinamy do (x)inetd

Serwer CVS warto uruchamiać jako usługę (x)inetd. Jest to w sumie jeden z przykładów zawartych w /etc/inetd.conf. Ale ponieważ interesuje nas uruchomienie całości w chroot, zatem musimy nieco zmienić argumenty (x)inetd.conf. W tym celu napiszemy sobie prosty programik w C. Oto on:

#include

#include

#define BASE "/var/chroot/cvs"
#define OWNER_UID 2401
#define OWNER_GID 2401

int main(int argc, char *argv[])
{
int res;

res = chdir(BASE);
if ( res ) exit(1);

res = chroot(BASE);
if ( res ) exit(2);

res = setresgid(OWNER_GID, OWNER_GID, OWNER_GID);
if ( res ) exit(3);

res = setresuid(OWNER_UID, OWNER_UID, OWNER_UID);
if ( res ) exit(4);

execl("/usr/bin/cvs", "cvs",
"--allow-root=/cvsroot/prj0",
"--allow-root=/cvsroot/prj1",
"--allow-root=/cvsroot/prj2",
"pserver",
NULL);
exit(3);
}

Całość zapiszemy w pliku run-cvs.c. Następnie skompilujemy (gcc) i
zainstalujemy w /usr/local/sbin.

Po zainstalowaniu naszego wrapera, konfiguryjemy (x)inetd:

# Fragment xinetd.conf w celu uruchomienie chrootowego CVS (pserver)
#
service cvspserver
{
flags = NAMEINARGS
socket_type = stream
protocol = tcp
wait = no
user = root
server = /usr/local/sbin/run-cvs
server_args = run-cvs
}

Lub też w przypadku wykorzystywania systemowego inetd, konieczne jest
dopisanie takiej oto linijki:

2401 stream tcp nowait root /usr/local/sbin/run-cvs run-cvs

Po zrestartowaniu (x)inetd można próbować podłączać się do
lokalnego serwera CVS.

$ telnet 0 2401
Trying 0.0.0.0...
Connected to 0.
Escape character is '^]'.
quit
cvs [pserver aborted]: bad auth protocol start: quit

Connection closed by foreign host.

5. Dodawanie projektów

Teraz pozostało już tylko dorzucanie kolejnych projektów (patrz argument --allow-root polecenia cvs), dodawanie użytkowników w chroot oraz nadawanie im uprawnień. Należy tylko pamiętać, że w celu ustawienia hasła dla użytkownika z chroot'a., konieczne jest znaleźć się w chroot:

# chroot ${CHROOTCVS}
# passwd prj00

5. A właściwie po co to wszystko?

Można powiedzieć: dobre pytanie? Cóż odpowiedź jest w sumie prosta. Całość została zaimplementowana, aby wydzielić repozytrium CVS na potrzeby projektu tłumaczenia kalendarza. Oprócz tego repozytrium, posiadam na swoim serwerze repozytrium CVS na różne prowadzone projekty czy prace. Zaś te chciałem, aby nie były dostane publicznie wraz z kalendarzem.

6. Skrypt

Jak łatwo się zorientować, wszystkie polecenia dla SHELLa tworzą w całości skrypt. Tak też jest w rzeczywistości. Skrypt można oczywiście znaleźć w dziale skrypty serwisu.

Należy tylko pamiętać, że po każdej aktualizacji systemu, warto przegrać pliki binarne. W takim wypadku dobrze byłoby podzielić skrypt na etapy, ale trudniej byłoby go opublikować na potrzeby niniejszego artykułu.

7. Źródła w sieci

W celu wykonania chrootowanego CVSa korzystałem z linków znalezionych za pomocą nieocenionego Google'a:

Autor: 
Krzysztof Stryjek [wtp+chrootcvs (at) bsdguru.org]
Porozmawiaj o tym artykule na forum: 

tytus, nie., 20/04/2008 - 16:30