wu-ftpd
Poniższy dokument pomoże Ci (mam nadzieję) skonfigurować wu-ftpd tak, abyś mógł
udostępnić userom usługę ftp tylko do zadanego miejsca i nie pozwolić mu
poruszania się po strukturze katalogów serwera innej niż HOME-directory.
O ile mi wiadomo wu-ftpd nie ma usługi ograniczania ilości logowań z jednego IP,
więc jak ktoś wie więcej to proszę o kontakt. Ograniczać logowania można z
poziomu systemu przy pomocy PAMa, ale nie o tym ten dokument traktuje.
-----------------------
Zalóżmy, że user z accessem tylko do ftp ma id luser i nalezy do grupy ftpaccess
1. Dodaj do systemu usera luser i stwórz grupe ftpaccess:
Wyedytuj plik /etc/group i na jego koncu dodaj taki wiersz:
ftpaccess:x:150: # gid 150 jest oczywiście przezemnie wybranym gid
# możesz wybrać dowolny wolny gid (gid - group identity)
Wyedytuj plik /etc/passwd i na jego koncu dodaj taki wiersz:
luser:x:105:150:FTP user:/home/luser/./:/bin/false
# 105 - wolny uid (user identity)
ta czesc z /./ jest wazna
WAZNE !!
Wyedytuj plik /etc/shells i na jego końcu (jak zwykle) dodaj linijkę:
/bin/false
Utwórz katalog /home/luser i daj mu prawa conajmniej do czytania i wykonywania:
mkdir /home/luser
chmod 555
2. Teraz czas się zabrać za konfigurację wu-ftpd
Jezeli masz anonimowego ftp (zakładam, że masz) to przekopiuj do katalogu
/home/luser katalogi ~ftp/bin/ i ~ftp/lib/, następnie utwórz katalog
/home/luser/etc i przekopiuj do niego plik /etc/group (możesz wyciać z niego
wszystkie grupy nie mające nic wspólnego z tym userem) oraz /etc/passwd
zostawiając w nim tylko linijkę z userem i root'em (jeśli chcesz żeby id plików
i katalogów były widoczne słowami a nie cyferkami).
Załóż też katalogi np ~luser/pub i ~luser/upload
Wyedytuj plik /etc/ftpacces i dodaj takie linijki:
guestusers *
guestgroup ftpaccess
Wykonaj dwa polecenia:
killall -HUP inetd
chroot /home/luser/ ls
W zasadzie to już wszystko. Teraz ftp-nij się i przejdź katalog wyżej.
ftp localhost, a potem cd ..
Działa ? To dobrze :)
3. Teraz jeszcze troche o uploadzie
Wyedytuj ponownie plik /etc/ftpaccess i wstaw takie linijki:
upload /home/luser * yes
upload /home/luser /bin no
upload /home/luser /etc no
upload /home/luser /lib no
upload /home/luser /pub no
upload /home/luser /upload yes luser ftpaccess 0660 dirs
Dla anonymousa będzie to tak wyglądało:
upload /home/ftp * yes
upload /home/ftp /bin no
upload /home/ftp /etc no
upload /home/ftp /lib no
upload /home/ftp /pub no
upload /home/ftp /incoming yes ftp daemon 0666 dirs
Aby można było uploadować z resumingiem musisz jeszcze zrobić małą poprawkę w
sekcji jak poniżej:
compress yes all
tar yes all
chmod no guest,anonymous
delete no guest,anonymous
overwrite no anonymous # czyli wyciąć guest'a z tej linijki
rename no guest,anonymous
umask no anonymous
Jeszcze mała poprawka. Mianowicie katalog /home/luser/upload lub
/home/ftp/incoming powinny mieć prawa do zapisywania dla luser'a (np 777)
4. A teraz prostrzy sposób na chrootowanego usera :)
Wystarczy w /etc/ftpaccess dopisać linijkę (napewno w ver wu-ftpd 2.6.1
w innych nie sprawdzałem):
restricted-gid users # dla grup, a users to grupa znajdująca się w /etc/group
lub
rectricted-uid luser # dla userów, a luser to user znajdujący się w /etc/passwd
Nie potrzeba żadnej spacjalnej struktury katalogów, żadnego ~/bin ~/etc ~/lib.
Wystarczy tylko któryś z powyższych wpisów i user nie wydostanie się z katalogu
jaki ma wpisany w /etc/passwd.
Przejście do katalogu wyżej kończy się komunikatem:
550 Permission denied on server. You are restricted to your account.
5. Dygresja o limitach
Niektórzy (np ja :) chcieliby, żeby nikt podczas np godzin pracy firmy
nie ładował się z różnych powodów na serwer i nie zapychał łącza lokalnym
userom. Można serwer wu-ftpd uruchamiać o konkretnej porze dnia lub w
konkretnych dniach. Np chcesz, żeby pracował całą sobotę i niedzielę, a w dni
powszednie między 17:00 a 7:00:
limit all 20 SaSu|Any1700-0700 /etc/msgs/msg.toomany
limit all 0 Any /etc/msgs/msg.limit
Jak to czytać ? Otóż tak: limit logowań dla class'y all jest 20 i tylko w sobotę
(Sa) i w niedzielę (Su) oraz w pozostałe dni między 17:00, a 7:00.
/etc/msgs/msg.toomany pokazuje się jak zalogowanych jest 20 userów i 21-wszy
próbuje się dostać
/etc/msgs/msg.limit pokazuje się wówczas, gdy server nie wpuszcza w danej
godzinie. Można podać komunikat kiedy jest "czynny".
Jak ktoś chce to zrobić przy pomocy crontab'a to proszę bardzo, ale wówczas
zamyka się cały serwer, a można np wpuszczać userów z sieci lokalnej zawsze.
Tak wiec po to się tworzu klasy (class):
class local real,guest,anonymous 192.168.1.0/24
class guest guest *
class rest real,anonymous *
Klasa local udostępnia wszystkie usługi (real - dla userów shellowych, guest -
chrootowany katalog, anonymous - anonimowy dostęp) dla maszyn z sieci
wewnetrznej 192.168.1.0/24
Klasa guest jest dla chrootowanych z calego świata.
Klasę rest stworzyłem dla userów shellowych i anonymousa.
Oczywiście możesz się bawić w więcej klas, albo każdemu (real, guest, anonymous)
dać oddzialną klasę i dla nich tworzyć limity. Ja tak sobie przyjąłęm.
limit rest 10 Any /etc/msgs/msg.toomany
limit local 10 Any /etc/msgs/msg.toomany
limit guest 20 SaSu|Any1700-0700 /etc/msgs/msg.toomany
limit guest 0 Any /etc/msgs/msg.limit
To najprostrze limity dla tych klas. Mam nadzieję, że jasne. Jeśli zamiast 0
w ostatniej linijce wpiszesz np 5, to poza limitem userzy będą mogli się do
niego dostać ale tylko 5 sesji. Jeżeli user zaloguje się przed czasem, np 6:55
to będzie spokojnie ściągał do momentu aż wyleci z timeoutem lub skończy
ściągać i wyleci z timeoutem :) Limity nie killują sesji.
---------------------
Polecam wu-ftpd conajmniej w ver 2.6.1, ma sporo ciekawych opcji ladnie
opisanych w manualu, nawet ratio można zrobić w prosty sposób :) Wyczytałem
nawet o prostrzym sposobie tworzenia chrootowanego usera, ale innym razem
tym się zajmę. Brakuje mi jeszcze w nim limitów logowań z danego IP, ale...
---------------------
by Gildor
gildor@atom.pl
ipchains
#!/bin/sh # ipchains jest nowym narzędziem w kernelach 2.2.x # Ten dokument nie jest żadnym manualem ani niczym takim. Ma tylko pomóc Ci w # konfiguracji firewalla/maskarady. Nie zamierzam tu opisywać wszystkich # dostępnych opcji ipchains ani rozpisywać się na jego temat. To wszystko # znajdziesz w manualu do ipchains oraz w dokumentacji dostępnej wraz z # tym narzędziem (zwykle w /usr/doc/ipchains-x.x.x/) # Jeśli chcesz użyć tego dokumentu jako skryptu to go zmodyfikuj wg swoich # wymagań i używaj do woli :) # ------------------------------------------------------------------------- # Przyujmuje, że maszyna która ma byc firewallem ma dwa interface'y ethernet # (dwie karty sieciowe :) eth0 i eth1. Internet jest podłączony do eth0, zaś # sieć wewnętrzna do eth1 # OK, najpierw kilka zmiennych żeby było łatwiej MASQ_NET=192.168.1.0/24 # sieć, którą przyjąłeś za maskaradą MASQ_IP=192.168.1.1 # adres IP na eth1 od strony wewnetrznej sieci WORLD=0.0.0.0/0 # default (świat zewnętrzny) # ------------------------------------------------------------------------- # Włączenie forwardingu w systemie echo "1" > /proc/sys/net/ipv4/ip_forward # ------------------------------------------------------------------------- # Ta sekcja czyści istniejące regułki. Zahashuj te linijki jeśli będziesz # używał tego dokumenty jako skryptu i uruchamiał go podczas bootowania # systemu. /sbin/ipchains -F input /sbin/ipchains -F output /sbin/ipchains -F forward /sbin/ipchains -F worldnet /sbin/ipchains -X worldnet /sbin/ipchains -F filtr /sbin/ipchains -X filtr # ------------------------------------------------------------------------- # Ta sekcja ustawia flagi na interface'ach. Zasada podstawaowa w konfiguracji # wszelkiego rodzaju firewalli, to na input'cie wszystko jest zabronione oprócz # tego co jest dozwolone :) /sbin/ipchains -P input DENY /sbin/ipchains -P forward DENY /sbin/ipchains -P output ACCEPT # ------------------------------------------------------------------------- # Ten łańcuch, wstawiony na input eth0 (czyli zewnętrzny) "pilnuje" zasad # dostępu do maszyny filtrującej (firewalla). Linijka: # ipchains -A worldnet -j ACCEPT -p tcp ! -y # ma za zadanie wpuszczanie na input interface'u eth0 tylko odpowiedzi na # zapytania z wewnątrz sieci. Linijki zahashowane zezwalają na dostęp do # serwera z firewallem do wybranych usług. Pełna dowolność. Można też ograniczać # dostęp do tych usług z adresu źródłowego np: # ipchains -A worldnet -j ACCEPT -p tcp -s IP_źródła --dport ssh /sbin/ipchains -N worldnet /sbin/ipchains -A worldnet -j ACCEPT -p icmp # /sbin/ipchains -A worldnet -j ACCEPT -p tcp --dport auth # /sbin/ipchains -A worldnet -j ACCEPT -p tcp --dport ssh # /sbin/ipchains -A worldnet -j ACCEPT -p tcp --dport ftp-data # /sbin/ipchains -A worldnet -j ACCEPT -p tcp --dport ftp # /sbin/ipchains -A worldnet -j ACCEPT -p tcp --dport smtp /sbin/ipchains -A worldnet -j ACCEPT -p tcp ! -y /sbin/ipchains -A worldnet -j ACCEPT -p udp --sport domain # ------------------------------------------------------------------------- # To jest przydatny filterek do ograniczania dostępu z seci wewnętrznej # (zamaskowanej). Dla wszystkich udostępnia tylko kilka serwisów, a dla # dwóch maszyn (192.168.1.20 oraz 192.168.1.21) udostępnia wszystkie możliwe # usługi dostępne w internecie (jakie numery portów są przypisane do jakich # serwisów przeczytaj sobie w pliku /etc/services) /sbin/ipchains -N filtr /sbin/ipchains -A filtr -j ACCEPT -p icmp /sbin/ipchains -A filtr -j ACCEPT -p udp /sbin/ipchains -A filtr -j ACCEPT -p tcp -s 192.168.1.20 -d $WORLD /sbin/ipchains -A filtr -j ACCEPT -p tcp -s 192.168.1.21 -d $WORLD /sbin/ipchains -A filtr -j ACCEPT -p tcp -s $MASQ_NET -d $MASQ_IP /sbin/ipchains -A filtr -j ACCEPT -p tcp -s $MASQ_NET -d $WORLD --dport 22 /sbin/ipchains -A filtr -j ACCEPT -p tcp -s $MASQ_NET -d $WORLD --dport 25 /sbin/ipchains -A filtr -j ACCEPT -p tcp -s $MASQ_NET -d $WORLD --dport 80 /sbin/ipchains -A filtr -j ACCEPT -p tcp -s $MASQ_NET -d $WORLD --dport 110 /sbin/ipchains -A filtr -j ACCEPT -p tcp -s $MASQ_NET -d $WORLD --dport 119 /sbin/ipchains -A filtr -j ACCEPT -p tcp -s $MASQ_NET -d $WORLD --dport 443 # ------------------------------------------------------------------------- # OK, po kolei: # Pierwsza linijka jest odpowiedzialna za maskaradę, czyli dostęp sieci # tzw. nieroutowalnej (192.168.1.0/24) do internetu. # Druga - zezwala na dostęp do interface'u loopback # Trzecia - filtruje interface eth0 (zewnętrzny) czyli ustawia naszego firewalla # Czwarta - filtruje ruch z wewnątrz sieci na zewnątrz (cenzura :) /sbin/ipchains -A forward -j MASQ -s $MASQ_NET -d $WORLD /sbin/ipchains -A input -j ACCEPT -i lo /sbin/ipchains -A input -j worldnet -i eth0 /sbin/ipchains -A input -j filtr -i eth1 # Oczywiście nazwy interface'ów wg uznania, jak ktoś korzysta z pppd wiec # może mieć ppp0 zamiast np eth1 lub nie mieć wogóle eth. Istotny jest # interface aktywny. Jeśli korzystasz z pppd zmień ten skrypcik tak, żeby # można było go odpalać razem ze skryptem inicjujacym połączenie. W KDE # (kppp) można sobie takie coś podpiąć podczas startowania połączenia i # inny, który będzie clearował zabezpieczenia, startujący podczas rozłączania. # Huh, ale nagmatwałem. Poprostu przemyśl to sam :) # Dobrze byłoby dopisać jeszcze kilka linijek z modułami, które za maskaradą # nieźle ułatwiają życie: /sbin/insmod ip_masq_ftp /sbin/insmod ip_masq_irc /sbin/insmod ip_masq_mfw /sbin/insmod ip_masq_autofw #/sbin/insmod ip_masq_cuseeme /sbin/insmod ip_masq_portfw /sbin/insmod ip_masq_quake /sbin/insmod ip_masq_raudio #/sbin/insmod ip_masq_user #/sbin/insmod ip_masq_vdolive # Zahashowane to takie, których ja nie używam i nie specjalnie szukałem # do czego służą, reszta jak widać po nazwach.
ipmasqadm
#!/bin/bash
# -------------------------------------------------------------------------
# Tu już wkraczam w inne acz przydatne możliwości kerneli 2.2.x
# Forwardowanie portów maszyny z wewnątrz sieci, posiadającą adresy
# nieroutowalne (192.168.1.100) na zewnątrz udostępniając w ten sposób usługę
# ftp.
# Oczywiście ipmasqadm należy sobie doinstalowac, gdyż nie ma tego narzędzia
# w standartowej dystrybucji (http://archie.icm.edu.pl)
# I tak, jak ktos będzie się ftpował na maszyne z IP_ZEW (eth0 firewalla)
# w rzeczywistości wyląduje wewnątrz sieci na maszynie 192.168.1.100
# Radzę ostrożnie stosować tego typu narzędzia i z pełną świadomością, gdyż
# wpuszczasz w ten sposób delikwenta z zewnątrz do środka sieci.
IP_ZEW=207.46.131.91 # IP ethernetu maszyny wystawionej na zewnatrz (tu adres
# przykładowy ;)
/usr/sbin/ipmasqadm portfw -f
/usr/sbin/ipmasqadm portfw -a -P tcp -L $IP_ZEW 21 -R 192.168.1.100 21
/usr/sbin/ipmasqadm portfw -a -P tcp -L $IP_ZEW 20 -R 192.168.1.100 20
#
# I coś dla grających np w StarCrafta :)
echo "1" > /proc/sys/net/ipv4/ip_masq_udp_dloose
/usr/sbin/ipmasqadm autofw -A -r udp 6112 6112 -c tcp 6112