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:
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ę:
#
[ -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...
#
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:
#
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):
#
${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ć:
$ 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
#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:
#
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:
Po zrestartowaniu (x)inetd można próbować podłączać się do
lokalnego serwera CVS.
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:
# 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:
- http://www.unixtools.org/cvs/server-how-to.html
- http://www.pointless.nl/~peter/stuff/cvs-server.html
tytus, nie., 20/04/2008 - 16:30
