SFTP (skraćeno od SSH File Transfer Protocol a neki ga vikaju i Secure File Transfer Protocol) je mrežni protokol koji omogućava siguran pristup i prenos podataka kroz mrežu putem SSH (Secure Shell) tako da ako se bilo ko postavi između vas i rutera ili vam osluškuje saobraćaj – može samo da kuka i proklinje dan kad je Mijatović pogodio stativu.

U ovom zadatku na CentOS 7 minimal Linuksu, potrebno je podići SFTP server za dva chroot-ovana korisnika koja će pristupati istoj lokaciji – ali da jedan korisnik bude RO (read-only) korisnik a drugi RW (read-write) korisnik. Ti korisnici ne treba da imaju pristup shell-u i privilegije treba rešiti mimo ACL (Access Control List) ako je moguće.

Zašto chroot? Pa da korisnik, bilo da ima ili nema pristup shell-u (a ovde ćemo ih napraviti da nemaju) ne može da se švrćka po tuđim i sistemskim fajlovima već da bi bio ograničen samo na ono – što mu mi damo. Firme inače ovo koriste kad žele da neke fajlove podele sa svojim partnerima ili klijentima a ne bi baš da bude za svačije oči ako neko skida fajlove sa javne mreže iz MekDonaldsa.

Sve ćemo raditi kroz promenljive kako bi se olakšalo praćenje „da nešto ne zajebem“ i sve što treba to je da u prvom koraku definišete RW i RO korisnika, lokaciju koju ste zamislili za SFTP kao i inicijalni naziv foldera gde ste mislili da će RW korisnik smeštati fajlove (u ovom primeru Budzet). Sve možete copy-paste, ali naravno kao i uvek – ako radite na produkcionom serveru budite pažljivi i sa četvoro otvorenih očiju.

Dakle ovako bi otprilike to trebalo da izgleda…

############## PRVI KORAK #################
#------ PROMENLjIVE (unesite sami) -------#
KORISNICKO_IME_RW=NarodSrbije
KORISNICKO_IME_RO=VladaSrbije
LOKACIJA_ZA_SFTP="/home/Srbija/NarodnaBanka"
IME_SFTP_FOLDERA="Budzet"
#-----------------------------------------#
############### DRUGI KORAK ###############
CHROOT_FOLDER="${LOKACIJA_ZA_SFTP}/${KORISNICKO_IME_RW}_sftp"
mkdir -p ${CHROOT_FOLDER}

groupadd ${KORISNICKO_IME_RW}_sftp
useradd -g ${KORISNICKO_IME_RW}_sftp ${KORISNICKO_IME_RW} -d ${CHROOT_FOLDER}/${IME_SFTP_FOLDERA} --shell=/sbin/nologin
useradd -g ${KORISNICKO_IME_RW}_sftp ${KORISNICKO_IME_RO} -d ${CHROOT_FOLDER}/${IME_SFTP_FOLDERA} --shell=/sbin/nologin #Ignore error

#################################################################
PROVERA=`grep "#Subsystem" /etc/ssh/sshd_config | wc -l`
if [ ${PROVERA} -eq 0 ] ; then $(sed -i s/"Subsystem"/"#Subsystem"/g /etc/ssh/sshd_config) ; fi
if [ ${PROVERA} -eq 0 ] ; then $(echo "#--------------------------#" >> /etc/ssh/sshd_config) ; fi
if [ ${PROVERA} -eq 0 ] ; then $(echo "Subsystem sftp internal-sftp" >> /etc/ssh/sshd_config) ; fi
if [ ${PROVERA} -eq 0 ] ; then $(echo "#--------------------------#" >> /etc/ssh/sshd_config) ; fi
##################################################################

echo "Match Group ${KORISNICKO_IME_RW}_sftp" >> /etc/ssh/sshd_config
echo " X11Forwarding no" >> /etc/ssh/sshd_config
echo " AllowTcpForwarding no" >> /etc/ssh/sshd_config
echo " ChrootDirectory ${CHROOT_FOLDER}" >> /etc/ssh/sshd_config
echo " ForceCommandinternal-sftp" >> /etc/ssh/sshd_config

chown ${KORISNICKO_IME_RW}:${KORISNICKO_IME_RW}_sftp ${CHROOT_FOLDER}/${IME_SFTP_FOLDERA}
chmod g=rx ${CHROOT_FOLDER}/${IME_SFTP_FOLDERA}

systemctl restart sshd
passwd ${KORISNICKO_IME_RW} ; passwd ${KORISNICKO_IME_RO} ;

Nakon prvog log-off će sve privremene varijable biti obrisane tako da ako želite to da uradite pre vremena samo ukucajte exit i pritisnite enter. Ove gore skripte možete kreirati i za nove korisnike mimo postojećih, samo promenite podatke u prvom koraku,

Preporuka je i promeniti SSH port sa difoltnog 22 na neki bezveze kao i postaviti nadgledanje pokušaja probijanja lozinke i zaštitu kroz fail2ban – sve objašnjeno u ovom tekstu.