Tôi đã xây dựng máy chủ SFTP thế nào?

Tôi đã hướng dẫn xây dựng máy chủ FTP ở bài viết trước. Trong bài viết này, tôi cung cấp cho bạn khái niệm máy chủ SFTP, làm thế nào để xây dựng nó, và một số lưu ý.

Thế nào là SFTP?

FTP (File Transfer Protocol) là một cách thức phổ biến để chuyển các tập tin giữa hai máy chủ. Yếu điểm là dữ liệu được truyền dạng clear text, bởi vậy một ai đó hoàn toàn có thể lấy dữ liệu của bạn. Do đó, FTP (File Transfer Protocol) không khuyến khích sử dụng cho những dịch vụ ở internet, trong nội bộ công ty thì có thể cân nhắc về nhiệm vụ và tính chất dữ liệu quyết định dùng/ không dùng FTP (File Transfer Protocol).

SFTP, hay là SSH File Transfer Protocol, hoặc Secure File Protocol là giao thức truyền tập tin giữa hai máy chủ. Nó thiết lập một kết nối an toàn để cung cấp quyền truy cập, truyền tập tin và quản lý tập tin.

Xây dựng máy chủ SFTP thế nào?
Thông tin hệ điều hành máy chủ và phiên bản [SSH](https://en.wikipedia.org/wiki/Secure_Shell) sử dụng trong bài viết:  

(1) CentOS release 6.6 (Final)
(2) openssh-server-6.9p1-1.x86_64

(Đoạn chú ý 01)
Để đảm bảo tính an toàn, khả năng hồi phục cấu hình SSH, tôi copy file cấu hình SSH để backup. Một sự ngớ ngấn nào đó có thể gây ra tai họa lớn, và tôi cần trở lại cấu hình SSH ban đầu để đảm bảo "mạng sống được trở lại". Tôi khuyến khích bạn làm điều này, với tất cả những thay đổi của mình: "trước khi thay đổi bất kỳ, bạn nên backup file cấu hình".

(Đoạn chú ý 02)
Có thêm một chú ý, bạn nên mở 2 cửa sổ terminal cùng đăng nhập vào máy chủ SFTP. Một cửa sổ để bạn thao tác cấu hình - tôi gọi cửa sổ 01, một cửa sổ để giữ phiên kết nối SSH của cấu hình trước thay đổi - tôi gọi cửa sổ 02. Khi bạn áp dụng (apply) thay đổi ở cửa sổ 02, và bạn bị thoát ra cửa sổ 02 thì bạn vẫn còn cửa sổ 01 để rollback cấu hình (như đã nói ở đoạn chú ý 01).

Bước 1: tạo file backup cấu hình SSHD_CONFIG
[[email protected] ~]$ cp /etc/ssh/sshd_config /etc/ssh/sshd_config.orig

Bước 2: mở file /etc/ssh/sshd_config tìm đến dòng # override default of no subsystems và sửa như dưới

# override default of no subsystems
#Subsystem      sftp    /usr/libexec/openssh/sftp-server
Subsystem       sftp internal-sftp -l INFO -f AUTH  
GatewayPorts no  
        AllowTcpForwarding yes
        KeepAlive yes
        Match Group sftponly
        ForceCommand internal-sftp -l VERBOSE
        ChrootDirectory /home/sftp/%u

Bước 3: restart SSHD Service để áp dụng thay đổi
[[email protected] ~]$ /etc/init.d/sshd restart

Bước 4: tạo thư mục /home/sftp
[[email protected] ~]$ mkdir /home/sftp

Bước 5: tạo user sftp
[[email protected] ~]$ useradd -d /home/sftp/ -s /bin/false -g sftponly sftp_user

Bước 6: kiểm tra user sftp
[[email protected] ~]$ cat /etc/passwd | grep sftp_user
sftp_user:x:510:510::/home/sftp/:/bin/false

Nếu có hơn 01 user sftp, bạn có thể kiểm tra tiếp để chắc chắn user đã cấu hình đúng:
[[email protected] ~]$ cat /etc/passwd | grep sftp_user_1
[[email protected] ~]$ sftp_user_1:x:508:500::/home/sftp/:/bin/false

Bước 7: nếu bạn dùng iptables firewall, bạn cần mở firewall để người dùng từ internet kết nối tới SFTP Server. Trong bài viết này, tôi đã thay đổi SSH port mặc định từ 22 thành 65535.
[[email protected] ~]$vim /etc/sysconfig/iptables
-A INPUT -m state --state NEW -m tcp -p tcp --dport 65535 -j ACCEPT Bước 8: restart iptables để áp dụng thay đổi
[[email protected] ~]$ /etc/init.d/iptables restart

Giải thích cú pháp:

Subsystem sftp internal-sftp -l INFO -f AUTH
Subsystem để cấu hình một external subsystem. Đối số phải là một tên hệ thống con và một lệnh (với các đối số tùy chọn để thực hiện theo yêu cầu của subsystem. Ở đây, lệnh sftp internel-sftp để thực hiện một subsystem SFTP.

-l INFO
-l log_level: nó định nghĩa log của SFTP-SERVER. Những giá trị có thể là QUIET, FATAL, ERROR, INFO, VERBOSE, DEBUG, DEBUG1, DEBUG2, and DEBUG3

-f AUTH
-f: Specifies the facility code that is used when logging messages from sftp-server. Những giá trị có thể là DAEMON, USER, AUTH, LOCAL0, LOCAL1, LOCAL2, LOCAL3, LOCAL4, LOCAL5, LOCAL6, LOCAL7. Giá trị mặc định là AUTH

GatewayPorts no
Specifies whether remote hosts are allowed to connect to ports forwarded for the client. By default, sshd(8) binds remote port forwardings to the loopback address. This prevents other remote hosts from connecting to forwarded ports. GatewayPorts can be used to specify that sshd should allow remote port forwardings to bind to non-loopback addresses, thus allowing other hosts to connect. The argument may be no to force remote port forwardings to be available to the local host only, yes to force remote port forwardings to bind to the wildcard address, or clientspecified to allow the client to select the address to which the forwarding is bound. The default is no. When you forward a TCP port (either locally or remotely), by default SSH only listens for connections to the forwarded port on the loopback address (localhost, 127.0.0.1). This means only other programs running on the same host as the listening side of the forwarding can connect to the forwarded port. This is a security feature, since there is no authentication applied to such connections. Also, such a forwarded connection is potentially insecure, since a portion of it is carried over the network in a plain TCP connection and not protected by SSH

AllowTcpForwarding yes
Specifies whether TCP forwarding is permitted. The available options are yes (the default) or all to allow TCP forwarding, no to prevent all TCP forwarding, local to allow local (from the perspective of ssh(1)) forwarding only or remote to allow remote forwarding only. Note that disabling TCP forwarding does not improve security unless users are also denied shell access, as they can always install their own forwarders.

KeepAlive yes
Specifies whether the system should send TCP keepalive messages to the other side. If they are sent, death of the connection or crash of one of the machines will be properly noticed. However, this means that connections will die if the route is down temporarily, and some people find it annoying. On the other hand, if TCP keepalives are not sent, sessions may hang indefinitely on the server, leaving “ghost” users and consuming server resources.

Match Group sftponly
Cho phép duy nhất người dùng là thành viên của group sftponly login vào SFTP

ForceCommand
Forces the execution of the command specified by ForceCommand, ignoring any command supplied by the client and ~/.ssh/rc if present. The command is invoked by using the user's login shell with the -c option. This applies to shell, command, or subsystem execution. It is most useful inside a Match block. The command originally supplied by the client is available in the SSH_ORIGINAL_COMMAND environment variable. Specifying a command of internal-sftp will force the use of an in-process SFTP server that requires no support files when used with ChrootDirectory. The default is none.

ChrootDirectory
Thư mục được thiết lập chroot sau khi người dùng đăng nhập. Khi một phiên sshd khởi động, nó kiểm tra tất cả các thành phần của đường dẫn đã được chroot, cái mà không cho phép ghi bởi người dùng khác hoặc nhóm. Sau khi chroot thay đổi thư mục làm việc đến thưc mục đã được thiết lập cho người dùng. Những đối số sau được thiết lập cho ChrootDirectory

Arguments to some keywords can make use of tokens, which are expanded at runtime:

  • %% A literal ‘%’.
  • %F The fingerprint of the CA key.
  • %f The fingerprint of the key or certificate.
  • %h The home directory of the user.
  • %i The key ID in the certificate.
  • %K The base64-encoded CA key.
  • %k The base64-encoded key or certificate for authentication.
  • %s The serial number of the certificate.
  • %T The type of the CA key.
  • %t The key or certificate type.
  • %u The username.

AuthorizedKeysCommand accepts the tokens %%, %f, %h, %k, %t, and %u.
AuthorizedKeysFile accepts the tokens %%, %h, and %u.
AuthorizedPrincipalsCommand accepts the tokens %%, %F, %f, %h, %i, %K, %k, %s, %T, %t, and %u.
AuthorizedPrincipalsFile accepts the tokens %%, %h, and %u.
ChrootDirectory accepts the tokens %%, %h, and %u.

/bin/false is just a binary that immediately exits, returning false, when it's called, so when someone who has false as shell logs in, they're immediately logged out when false exits

Kết luận

Trong bài viết này, tôi đã hướng dẫn bạn cách xây dựng máy chủ SFTP. Nếu bạn là người mới bắt đầu với SFTP Server, tôi có niềm tin bài viết giúp ích cho bạn. Tôi rất vui khi bạn đọc tới đây.

Lời cám ơn

Tôi cám ơn bạn đã dành thời gian để đọc bài viết này. Tất nhiên, tôi luôn quan tâm đến hoàn thiện chất lượng bài viết, vì vậy mọi sự đóng góp của bạn là sự khích lệ đối với tôi.

Bài viết thể hiện quan điểm, văn phong của tác giả. Mọi sự tranh luận, phản biện được khuyến khích. Và tôi bảo lưu mọi quan điểm cho đến khi mọi thứ được sáng tỏ trên cơ sở sự chính xác của thông tin.

Tài liệu tham khảo

Để viết bài này, tôi đã sử dụng các tài liệu tham khảo
https://en.wikipedia.org/wiki/TransmissionControlProtocol
https://en.wikipedia.org/wiki/Chroot
http://man.openbsd.org/sshdconfig.5#TOKENS
http://man.openbsd.org/sftp-server.8
https://en.wikibooks.org/wiki/OpenSSH/Cookbook/File
TransferwithSFTP

Tien Phan

Read more posts by this author.

Subscribe to

Get the latest posts delivered right to your inbox.

or subscribe via RSS with Feedly!