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 Linuxu, 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 shellu 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 shellu (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 McDonaldsa.

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 " ForceCommand internal-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.