Bu makalede Centos/RedHat işletim sistemleri üzerinde SFTP kurulumunu açıklayacağım. Kurulumu anlatmadan önce SFTP hakkında kısaca bilgi vermek gerekiyor.
Halihazırda kullanıcılar bir sunucudan istemciye veya istemciden sunucuya dosya aktarmak için FTP’yi kullanıyor. Ancak bu protokol, bağlantı noktaları herkese açık olduğundan, anonim davetsiz misafirler tarafından kolayca (TLS kullanılmazsa) saldırıya uğrayabiliyor. Bu nedenle, SFTP güvenlik düzeyini artırmak için kullanıma sunuldu.
SFTP, SSH File Transfer Protokol veya Secure File Transfer Protokol anlamına gelmektedir. SFTP güvenli bağlantı sağlamak için SSH ile paketlenmiş ayrı bir protokol kullanmaktadır.
1. Ön Not
Bu makale için, 64bit sürümünde CentOS 7 kullanıyorum. Aynı adımlar CentOS 6 veya CentOS 8 için de geçerli olacak. Makalenin sonunda, bir istemcinin SFTP sunucusuna erişebileceğini, ancak SSH ile sunucuya giriş yapamayacağını ortaya koymuş olacağız.
2. SFTP Kurulumu
Normal FTP’den farklı olarak, SFTP’yi kullanmak için ek paketler yüklemeye gerek yoktur. Sadece sunucuya kurulum sırasında zaten yüklenmiş olan prebuild SSHd paketine ihtiyacımız var. Bu nedenle, gerekli SSH paketine sahip olup olmadığınızı kontrol edelim.
Bunun için gerekli parametre:
rpm -qa|grep ssh
Çıktı buna benzer olmalıdır:
[root@localhost ~]# rpm -qa|grep ssh
libssh2-1.4.3-10.el7_2.1.x86_64
openssh-7.4p1-13.el7_4.x86_64
openssh-server-7.4p1-13.el7_4.x86_64
openssh-clients-7.4p1-13.el7_4.x86_64
Hepsi bu, şimdi SFTP yapılandırmasını nasıl yapacağımıza bakalım.
3. SFTP Yapılandırması
Kurulumun tüm önkoşulları tamamlandıktan sonra, yapılandırma aşamasına geçeceğiz. En iyi uygulama için, SFTP erişimi olan tüm kullanıcıları yönetebileceğimiz bir grup ve kullanıcı oluşturmamız gerekir. Ama önce, data adlı ek bir klasör oluşturalım.
Gerekli adımlar:
mkdir -p /data/sftp
chmod 701 /data
Temel olarak yukarıdaki adımla yapmaya çalıştığım şey, SFTP erişimi için ana dizin olarak ayrı bir klasör elde etmektir. SFTP kullanıcıları için tüm kullanıcı dizinleri bu veri klasörünün alt dizinleri olacaktır.
SFTP kullanıcısı için bir grup oluşturalım:
groupadd sftpusers
Ardından bir sftp kullanıcısı oluşturup ve SFTPUSERS grubuna atıyoruz:
useradd -g sftpusers -d /upload -s /sbin/nologin sftpuser
passwd sftpuser
Changing password for user sftpuser.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
Aşağıda yukarıdaki komutların açıklaması verilmiştir:
- Bir kullanıcı oluşturuyorum ve kullanıcıyı -g komutunu kullanarak sftpusers grubuna dahil ediyoruz.
- -d /upload komutunu kullanrak kullanıcının /upload dizininde olması için ana dizini atamış oluyoruz. Bu, daha sonra / upload klasörünün /data/sftpuser/upload altında olacağı anlamına geliyor.
- Kullanıcının yalnızca SSH değil SFTP protokolünü kullanabilmesini sağlamak için /sbin/nologin ile erişimi sınırlıyoruz.
- Kullanıcıyı “sftpuser”olarak adlandırıyoruz.
- “sftpuser” için şifre ayarlıyoruz.
Şimdi /data/sftpuser altında /upload klasörünü oluşturalım, ardından klasöre uygun sahiplik atayalım.
mkdir -p /data/sftpuser/upload
chown -R root:sftpusers /data/sftpuser
chown -R sftpuser:sftpusers /data/sftpuser/upload
Şimdi, /data dizini altındaki yeni klasörün var olduğunu ve yapılandırmayı doğru yaptığımızı doğrulayalım.
Şimdi bir SFTP işlemi oluşturmak için SSH protokolünü yapılandıralım. Bu, yapılandırma dosyasını /etc/ssh/sshd_config dosyasını düzenleyerek yapılabiliriz
[root@localhost ~]# ls -ld /data/
drwx-----x. 5 root root 8 Jan 21
14:29 /data/
[root@localhost ~]# ls -ld /data/sftpuser
drwxr-xr-x. 3 root sftpusers 8 Jan 21
14:29 /data/sftpuser
[root@localhost ~]# ls -ld /data/sftpuser/upload
drwxr-xr-x. 2 sftpuser sftpusers 8 Jan 21 14:29 /data/sftpuser/upload
[root@localhost ~]# cat /etc/passwd|grep sftpuser
sftpuser:x:1001:1001::/upload:/sbin/nologin
nano /etc/ssh/sshd_config
Dosyanın sonuna aşağıdaki satırları ekleyelim.
Match Group sftpusers
ChrootDirectory /data/%u
ForceCommand internal-sftp
SSH servisinin durumunu kontrol ederek ikinci adımda servisi yeniden başlatıyoruz:
service sshd status
Redirecting to /bin/systemctl status sshd.service
? sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2018-03-22 14:21:38 CET; 16min ago
Docs: man:sshd(8)
man:sshd_config(5)
Main PID: 942 (sshd)
CGroup: /system.slice/sshd.service
??942 /usr/sbin/sshd -D
Jan 21 14:21:37 localhost.localdomain systemd[1]: Starting OpenSSH server daemon...
Jan 21 14:21:38 localhost.localdomain sshd[942]: Server listening on 0.0.0.0 port 22.
Jan 21 14:21:38 localhost.localdomain sshd[942]: Server listening on :: port 22.
Jan 21 14:21:38 localhost.localdomain systemd[1]: Started OpenSSH server daemon.
Jan 21 14:21:49 localhost.localdomain sshd[1375]: Accepted password for root from 10.255.245.33port 59465 ssh2
service sshd restart
[root@localhost ~]# service sshd restart
Redirecting to /bin/systemctl restart sshd.service
4. SFTP’yi Test Etme
Şimdi her şey yapılandırıldı, bu yüzden kurulumun amacımıza uygun olduğundan emin olmak için bir test yapalım.
TEST adlı başka bir sunucu kullanarak SFTP’ye erişeceğiz. İlk olarak, SFTP sunucusunun bağlantı noktasını doğrulamak için nmap’i kullanıyoruz. İstemci sunucunuz üzerinde nmap yoksa, aşağıda gösterildiği gibi yum ile indirebilir ve yükleyebilirsiniz:
yum list nmap
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: centos.copahost.com
* epel: mirror.imt-systems.com
* extras: mirror.imt-systems.com
* remi-php72: remi.mirror.wearetriple.com
* remi-safe: remi.mirror.wearetriple.com
* updates: ftp.rz.uni-frankfurt.de
Available Packages
nmap.x86_64 2:6.40-7.el7
yum install nmap -y
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: centos.copahost.com
* epel: mirror.imt-systems.com
* extras: mirror.imt-systems.com
* remi-php72: remi.mirror.wearetriple.com
* remi-safe: remi.mirror.wearetriple.com
* updates: ftp.rz.uni-frankfurt.de
Resolving Dependencies
--> Running transaction check
---> Package nmap.x86_64 2:6.40-7.el7 will be installed
--> Processing Dependency: nmap-ncat = 2:6.40-7.el7 for package: 2:nmap-6.40-7.el7.x86_64
--> Running transaction check
---> Package nmap-ncat.x86_64 2:6.40-7.el7 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
=============================================================================================================================================================================================Package Arch Version Repository Size
=============================================================================================================================================================================================
Installing:
nmap x86_64 2:6.40-7.el7 base 4.0 M
Installing for dependencies:
nmap-ncat x86_64 2:6.40-7.el7 base 201 k
Transaction Summary
=============================================================================================================================================================================================Install 1 Package (+1 Dependent package)
Total download size: 4.2 M
Installed size: 17 M
Downloading packages:
(1/2): nmap-ncat-6.40-7.el7.x86_64.rpm | 201 kB 00:00:01
(2/2): nmap-6.40-7.el7.x86_64.rpm | 4.0 MB 00:00:14
———————————————————————————————————————————————————————————————
Total 300 kB/s | 4.2 MB 00:00:14
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : 2:nmap-ncat-6.40-7.el7.x86_64 1/2
Installing : 2:nmap-6.40-7.el7.x86_64 2/2
Verifying : 2:nmap-ncat-6.40-7.el7.x86_64 1/2
Verifying : 2:nmap-6.40-7.el7.x86_64 2/2
Installed:
nmap.x86_64 2:6.40-7.el7
Dependency Installed:
nmap-ncat.x86_64 2:6.40-7.el7
Complete!
[root@localhost ~]# nmap -n 10.255.245.33
Starting Nmap 6.40 ( http://nmap.org ) at 2018-03-22 14:51 CET
Nmap scan report for 10.255.245.33
Host is up (0.000016s latency).
Not shown: 997 closed ports
PORT STATE SERVICE
22/tcp open ssh
Nmap done: 1 IP address (1 host up) scanned in 0.12 seconds
Şu anda SFTP sunucumuzda tek açık bağlantı noktasının SSH 22 olduğunu fark edeceksiniz. Şimdi, TEST01 istemcisinden SFTP sunucusuna (IP: 10.255.245.33) erişmeye çalışalım:
[root@TEST01 /]# sftp sftpuser@10.255.245.33
sftpuser@10.255.245.33 's password:
Connected to 10.255.245.33.
sftp> pwd
Remote working directory: /upload
sftp>
Artık SFTP sunucumuza dışarıdan erişilebilir. Varsayılan dizinin /upload olduğuna dikkat edin. Bu, SFTP sunucu dizininde yapılan önceki yapılandırmamız /data/sftpuser/upload olmasına rağmen SFTP’nin yalnızca varsayılan yolu/upload olarak göstereceği anlamına gelir.
Şimdi test istemcimize SFTP sunucu dizininden bir dosya almaya çalışalım. İlk olarak, /data/sftpuser/upload altında bir test dosyası oluşturalım:
cd /data/sftpuser/upload
touch test_file.txt
Ardından TEST01 istemcisine geri dönün ve oluşturulan dosyayı indirip indiremeyeceğimizi görelim.
[root@TEST01 /]# sftp sftpuser@10.255.245.33
sftpuser@10.255.245.33's password:
Connected to 10.255.245.33.
sftp> pwd
Remote working directory: /upload
sftp> ls
test_file.txt
sftp> get test_file.txt
Fetching /upload/test_file.txt to test_file.txt
sftp> quit
Mükemmel! SFTP testimiz başarılı oldu, sftpuser kullanıcısını kullanarak SSH’a erişmeye çalışalım. Daha önce, yapılandırmayı /sbin/nologin olarak ayarladık, bu nedenle kullanıcı SSH hizmetlerini kullanamayacak:
[root@TEST01 ~]# ssh sftpuser@10.255.245.33
sftpuser@10.255.245.33's password:
This service allows sftp connections only.
Connection to 10.255.245.33 closed.
Güzel! Şimdi güvenli bir SFTP sunucumuz var ve istediğimiz gibi çalışıyor.
Faydalı olması dileği ile..