SFTP(SSHファイル転送プロトコル)、安全なファイル転送プロトコル。 Secure File TransferProtocolまたはSFTPと呼ばれることもあります。それとSCPの違いは、ユーザーが送信を中断できることです。
SCPのコピー速度はわずかに速くなります。 SFTPは、ファイルを転送するための安全な暗号化方法を提供できます。
SFTPとFTPの構文と機能はほぼ同じです。 SFTPはSSHの一部であり、ファイルをBloggerサーバーに転送するための安全な方法です。実際、SSHソフトウェアパッケージには、SFTPと呼ばれるパッケージがすでに含まれています。
安全なファイル転送サブシステムの場合、SFTP自体に個別のデーモンはありません。対応する接続操作を完了するには、sshdデーモン(デフォルトのポート番号は22)を使用する必要があるため、ある意味でSFTPにはありません。
サーバープログラムに似ていますが、クライアントプログラムに似ています。 SFTPも暗号化を使用して認証情報と送信データを送信するため、SFTPを使用するのは非常に安全です。ただし、この送信方法を使用しているため
暗号化/復号化技術を使用すると、伝送効率は通常のFTPよりもはるかに低くなります。[ネットワークセキュリティ](https://cloud.tencent.com/product/ns?from=10680)の要件が高い場合は、FTPの代わりにSFTPを使用できます。
SFTPについて話しましょう+Keepalivedデュアルマシン高可用性ソリューションの展開記録:
sftp-test01 172.16.51.191
sftp-test02 172.16.51.192
VIP 172.16.51.193
1つ、sftp-Test01サーバーの操作:
1 )opensshのバージョンを表示する
sshを使用する-opensshのバージョンを表示するVコマンド。バージョンは4より大きくなければなりません。.8p1、下位バージョンをアップグレードする必要があります。
[ root@sftp-test01 ~]# ssh -V
OpenSSH_5.3p1, OpenSSL 1.0.1e-fips 2013年2月11日2)sftpグループを作成する
[ root@sftp-test01 ~]# groupadd sftp
3 )ユーザー名mysftpとパスワードmysftpでsftpユーザーを作成します
ユーザーパスワードの変更は、Linuxユーザーパスワードの変更と同じです。
[ root@sftp-test01 ~]# useradd -g sftp -s /bin/false mysftp
[ root@sftp-test01 ~]# passwd mysftp
4 )sftpグループのユーザーのホームディレクトリはに割り当てられます/data/sftpの下で、ユーザー名で区別します。ここでは、最初にmysftpディレクトリを作成してから、mysftpのホームを次のように指定します。/data/sftp/mysftp
[ root@sftp-test01 ~]# mkdir -p /data/sftp/mysftp
[ root@sftp-test01 ~]# usermod -d /data/sftp/mysftp mysftp
5 )sshdを構成します_config
次の構成を変更または追加します
[ root@sftp-test01 ~]# cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak2
[ root@sftp-test01 ~]# vim /etc/ssh/sshd_config
......
# Subsystem sftp /usr/libexec/openssh/sftp-server
Subsystem sftp internal-sftp
Match Group sftp
ChrootDirectory /data/sftp/%u
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
Chrootディレクトリのアクセス許可を設定する
[ root@sftp-test01 ~]# chown root:sftp /data/sftp/mysftp
[ root@sftp-test01 ~]# chmod 755/data/sftp/mysftp
6 )SFTPユーザーログイン後に書き込み可能なディレクトリを作成します
上記の設定に従った後、sshdサービスを再起動した後、ユーザーmysftpはすでにログインできます。ただし、chrootを使用してルートディレクトリを指定した後、ルートは書き込みできないはずなので、mysftpがファイルをアップロードするために新しいディレクトリを作成する必要があります。
このディレクトリの所有者はmysftpであり、すべてのグループはsftpであり、所有者には書き込み権限があり、すべてのグループには書き込み権限がありません。
[ root@sftp-test01 ~]# mkdir /data/sftp/mysftp/upload
[ root@sftp-test01 ~]# chown mysftp:sftp /data/sftp/mysftp/upload
[ root@sftp-test01 ~]# chmod 755/data/sftp/mysftp/upload
7 )ファイアウォールをオフにします
[ root@sftp-test01 ~]# /etc/init.d/iptables stop
[ root@sftp-test01 ~]# setenforce 0
setenforce: SELinux is disabled
[ root@sftp-test01 ~]# cat /etc/sysconfig/selinux
.......
SELINUX=disabled
8 )sshdサービスを再起動します
[ root@sftp-test01 ~]# service sshd restart
Stopping sshd:[ OK ]
Starting sshd:[ OK ]9)sftp環境を確認します
以下は、SFTPが正常に構築されたことを示しています
[ root@sftp-test01 ~]# sftp [email protected]
Connecting to 172.16.51.191...
The authenticity of host '172.16.51.191 (172.16.51.191)' can't be established.
RSA key fingerprint is c0:f5:1d:03:3b:00:4a:11:54:8c:a7:a3:6f:77:47:c7.
Are you sure you want to continueconnecting(yes/no)? yes
Warning: Permanently added '172.16.51.191'(RSA) to the list of known hosts.
[email protected]'s password:
sftp> ls
upload
sftp> cd upload
sftp> ls
10 )FileZillaFTPクライアントを使用してSFTPサーバーに接続します
ホストIPアドレス172を入力します.16.51.191. SFTPサーバーに接続するためのユーザー名mysftp、パスワードmysftp、ポート(デフォルトポート22)。
接続後のデフォルトのパスは/data/sftp/mysftp
2、sftp-test02サーバーは上記のsftpである必要があります-test01と同じ操作!
三、sftp-test01およびsftp-test022台のマシン/data/リアルタイム同期用のsftpディレクトリ(rsync+inotify)
データの整合性とセキュリティを考慮して、一方向のリアルタイム同期を実装します。つまり、sftpから実装します。-test01マシン/data/リアルタイムでsftpにsftp同期-test02のデータ/sftp
操作は次のとおりです。
1 )ターゲットサーバー上でsftp-test02での展開プロセス
rsyncサーバーをインストールして構成します
[ root@sftp-test02 ~]# yum install rsync xinetd
[ root@sftp-test02 ~]# vim /etc/xinetd.d/rsync
......
disable = no
......
xinetedサービスを開始します
[ root@sftp-test02 ~]# /etc/init.d/xinetd start
Starting xinetd:[ OK ]
作成する/etc/rsyncd.confファイル
[ root@sftp-test02 ~]# vim /etc/rsyncd.conf
[ root@sftp-test02 ~]# cat /etc/rsyncd.conf
log file =/var/log/rsyncd.log
pidfile =/var/run/rsyncd.pid
lock file =/var/run/rsync.lock
secrets file =/etc/rsync.pass
motd file =/etc/rsyncd.Motd
[ sftp_upload]
path =/data/sftp
comment = sftp_upload
uid = root
gid = sftp
port=873
use chroot = no
read only = no
list = no
max connections =200
timeout =600
auth users = RSYNC_USER
hosts allow =172.16.51.191
注:権限について間違えないでください!
上に入力されたuidはrootで、gidはsftpです。/data/sftp/[root@sftp-test02 ~]# ll -d /data/sftp
drwxr-xr-x 3 root root 4096 Nov 2105:21/data/sftp
[ root@sftp-test02 ~]# ll /data/sftp/
total 4
drwxr-xr-x 3 root sftp 4096 Nov 2107:28 mysftp
ユーザー認証ファイルを作成する
[ root@sftp-test02 ~]# vim /etc/rsync.pass
RSYNC_USER:123456@rsync
ファイルのアクセス許可、つまりrsyncdを設定します.confとrsync.パス認証ファイルはすべて600のアクセス許可です。
[ root@sftp-test02 ~]# chmod 600/etc/rsyncd.conf
[ root@sftp-test02 ~]# chmod 600/etc/rsync.pass
rsyncサービスを再起動します
[ root@sftp-test02 ~]# /etc/init.d/xinetd restart
Stopping xinetd:[ OK ]
Starting xinetd:[ OK ][root@sftp-test02 ~]# lsof -i:873
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
xinetd 3797 root 5u IPv6 16264 0t0 TCP *:rsync(LISTEN)2)ソースサーバー上172.16.51.191での展開プロセス
[ root@sftp-test01 ~]# yum install rsync xinetd
[ root@sftp-test01 ~]# vim /etc/xinetd.d/rsync
......
disable = no
......[ root@sftp-test01 ~]# /etc/init.d/xinetd start
Starting xinetd:[ OK ][root@sftp-test01 ~]# lsof -i:873
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
xinetd 3444 root 5u IPv6 15917 0t0 TCP *:rsync(LISTEN)
同期されたパスワードファイルを作成します。ファイル名はサーバー認証ファイルとは異なる場合がありますが、内部のパスワードは同じである必要があります。 rsync同期コマンドで使用されます。
ただし、管理を容易にするために、両側に同じファイルを設定することをお勧めします。
[ root@sftp-test01 ~]# cat /etc/rsync.pass
123456@ rsync
rsyncを設定します.パスパスワードファイルは600の権限です
[ root@sftp-test01 ~]# chmod 600/etc/rsync.pass
サーバーカーネルがinotifyをサポートしているかどうかを確認します。次のコンテンツが表示され、サーバーカーネルがinotifyをサポートしていることを示します。
[ root@sftp-test01 ~]# ll /proc/sys/fs/inotify
total 0-rw-r--r--1 root root 0 Nov 2108:12 max_queued_events
- rw-r--r--1 root root 0 Nov 2108:12 max_user_instances
- rw-r--r--1 root root 0 Nov 2108:12 max_user_watches
注:Linuxでinotifyをサポートするカーネルの最小数は2です。.6.13.次のコマンドを入力できます:uname-aカーネルを表示する
CentOS 5.Xコアは2です.6.18.Inotifyはデフォルトですでにサポートされています
[ root@sftp-test01 ~]# uname -a
Linux sftp-test01 2.6.32-696.13.2.el6.x86_64 #1 SMP Thu Oct 521:22:16 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
以下にinotifyをインストールします-tools
[ root@sftp-test01 ~]# yum install make gcc gcc-c++[root@sftp-test01 ~]# cd /usr/local/src/[root@sftp-test01 src]# wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
[ root@sftp-test01 src]# tar zxvf inotify-tools-3.14.tar.gz
[ root@sftp-test01 src]# cd inotify-tools-3.14[root@sftp-test01 inotify-tools-3.14]# ./configure --prefix=/usr/local/inotify
[ root@sftp-test01 inotify-tools-3.14]# make && make install
inotifyが正常にインストールされていることがわかりました-ツール
[ root@sftp-test01 inotify-tools-3.14]# ll -d /usr/local/inotify/
drwxr-xr-x 6 root root 4096 Nov 2108:14/usr/local/inotify/
システム環境変数を設定する
[ root@sftp-test01 inotify-tools-3.14]# vim /etc/profile
....... export PATH=$PATH:/usr/local/inotify/bin
[ root@sftp-test01 inotify-tools-3.14]# source /etc/profile
ライブラリファイルを追加する
[ root@sftp-test01 inotify-tools-3.14]# vim /etc/ld.so.conf
...... /usr/local/inotify/lib
[ root@sftp-test01 inotify-tools-3.14]# ldconfig
inotifyのデフォルトパラメータを変更します(inotifyのデフォルトのカーネルパラメータ値が小さすぎます)
システムのデフォルトパラメータ値を表示する
[ root@sftp-test01 inotify-tools-3.14]# sysctl -a | grep max_queued_events
fs.inotify.max_queued_events =16384[root@sftp-test01 inotify-tools-3.14]# sysctl -a | grep max_user_watches
fs.inotify.max_user_watches =8192
fs.epoll.max_user_watches =796344[root@sftp-test01 inotify-tools-3.14]# sysctl -a | grep max_user_instances
fs.inotify.max_user_instances =128[root@sftp-test01 inotify-tools-3.14]# sysctl -w fs.inotify.max_queued_events="99999999"
fs.inotify.max_queued_events =99999999[root@sftp-test01 inotify-tools-3.14]# sysctl -w fs.inotify.max_user_watches="99999999"
fs.inotify.max_user_watches =99999999[root@sftp-test01 inotify-tools-3.14]# sysctl -w fs.inotify.max_user_instances="65535"
fs.inotify.max_user_instances =65535
パラメータの説明:
max_queued_events:
inotifyキューの最大長。値が小さすぎると表示されます。"** Event Queue Overflow **"エラー、結果として不正確な監視ファイル
max_user_watches:
同期するファイルに含まれるディレクトリの数を使用できます:find/Data/xqsj_upload -type d | wc -lこれらのソースディレクトリの下にあるディレクトリの数を数えます。_user_時計の値が統計結果よりも大きい(ここでは/Data/xqsj_アップロードは同期されたソースファイルディレクトリです)
max_user_instances:
各ユーザーによって作成されたinotifyインスタンスの最大数
次に、同期操作を実行します。
ソースサーバーでrsyncの最初の完全同期を実行します(さらに--パラメータを削除し、ターゲットディレクトリとソースディレクトリのファイルの整合性を完全に保ちます)
[ root@sftp-test01 ~]# rsync -avH --port=873--progress --delete/data/sftp/ [email protected]::sftp_upload --password-file=/etc/rsync.pass
最初の完全なrsync同期が完了したら、rsyncに進みます+リアルタイム同期スクリプト操作を初期化します。
リアルタイム同期スクリプトに追加されるのは--delete-代わりにパラメータの前--パラメータを削除(最初の完全同期のためにrsyncによって使用されるパラメーター)、2つの違い:
- - deleteパラメーター:rsync同期の前に、ターゲットディレクトリー内のすべてのファイルが激しく削除されてから、同期操作が実行されることを示します。
- - delete-beforeパラメータ:rsync同期の前に、ターゲットディレクトリが最初にスキャンおよび取得され、ソースディレクトリと比較してターゲットディレクトリ内の冗長ファイルが削除されてから、同期操作が実行されることを示します。明らかにより良い--削除パラメーターの方が安全です。
[ root@sftp-test01 data]# cd /data/script/[root@sftp-test01 script]# vim sftp_data_rsync.sh
#! /bin/bash
SRCDIR=/data/sftp/
USER=RSYNC_USER
IP=172.16.51.192
DESTDIR=sftp_upload
/usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M'--format '%T %w%f%e'-e close_write,modify,delete,create,attrib,move $SRCDIR |while read file
do/usr/bin/rsync -avH --port=873--progress --delete-before $SRCDIR $USER@$IP::$DESTDIR --password-file=/etc/rsync.pass
echo " ${file} was rsynced">>/tmp/rsync.log 2>&1
done
[ root@sftp-test01 script]# chmod 755 sftp_data_rsync.sh
[ root@sftp-test01 script]# nohup sh sftp_data_rsync.sh &//ctrlを押す+cが終了します[1]8807[root@sftp-test01 script]# ps -ef|grep inotify
root 88088807022:55 pts/000:00:00/usr/local/inotify/bin/inotifywait -mrq --timefmt %d/%m/%y %H:%M --format %T %w%f%e -e close_write,modify,delete,create,attrib,move /data/sftp/
root 88118451022:55 pts/000:00:00 grep inotify
このように、sftp-test01マシン/data/sftpディレクトリ内のファイルは自動的にリアルタイムでsftpに同期されます-test02マシン/data/sftpディレクトリ
注:これは一方向のリアルタイム同期です。双方向のリアルタイム同期を行いたい場合!次に、sftpする必要があります-test02マシンで別のinotify監視スクリプトを作成します(同時に、sftp-test01もrsyncdする必要があります.confファイル)
4、SFTPとKeepalivedを組み合わせて、デュアルマシンの高可用性を実現
1 )Keepalivedをダウンロードしてインストールします(両方のマシンで同じ操作)
[ root@sftp-test01 ~]# cd /usr/local/src/[root@sftp-test01 src]# wget http://www.keepalived.org/software/keepalived-1.3.2.tar.gz
[ root@sftp-test01 src]# tar -zvxf keepalived-1.3.2.tar.gz
[ root@sftp-test01 src]# cd keepalived-1.3.2[root@sftp-test01 keepalived-1.3.2]# ./configure && make && make install
[ root@sftp-test01 keepalived-1.3.2]# cp /usr/local/src/keepalived-1.3.2/keepalived/etc/init.d/keepalived /etc/rc.d/init.d/[root@sftp-test01 keepalived-1.3.2]# cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/[root@sftp-test01 keepalived-1.3.2]# mkdir /etc/keepalived
[ root@sftp-test01 keepalived-1.3.2]# cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/[root@sftp-test01 keepalived-1.3.2]# cp /usr/local/sbin/keepalived /usr/sbin/[root@sftp-test01 keepalived-1.3.2]# echo "/etc/init.d/keepalived start">>/etc/rc.local
2 )Keepalivedを構成します.confファイル
[ root@sftp-test01 keepalived-1.3.2]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
[ root@sftp-test01 keepalived-1.3.2]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
}
notification_email_from [email protected]
smtp_server smtp.wangshibo.com
smtp_connect_timeout 30
router_id master-node
}
vrrp_script chk_sftp_port {
script "/data/chk_sftp.sh"
interval 2
weight -5
fall 2
rise 1}
vrrp_instance VI_1 {
state MASTER
interfaceeth0
mcast_src_ip 172.16.51.191
virtual_router_id 51
priority 101
advert_int 1
authentication {
auth_type PASS
auth_pass 1111}
virtual_ipaddress {172.16.51.193}
track_script {
chk_sftp_port
}}
sftp-バックアップ側のKeepalivedとしてのtest02サーバー.confの構成は次のとおりです。
[ root@sftp-test02 keepalived-1.3.2]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
[ root@sftp-test02 keepalived-1.3.2]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
}
notification_email_from [email protected]
smtp_server smtp.wangshibo.com
smtp_connect_timeout 30
router_id master-node
}
vrrp_script chk_sftp_port {
script "/data/chk_sftp.sh"
interval 2
weight -5
fall 2
rise 1}
vrrp_instance VI_1 {
state BACKUP
interfaceeth0
mcast_src_ip 172.16.51.192
virtual_router_id 51
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 1111}
virtual_ipaddress {172.16.51.193}
track_script {
chk_sftp_port
}}
sftp監視スクリプトを作成します(両方のマシンを作成する必要があります)
[ root@sftp-test01 keepalived-1.3.2]# vim /data/chk_sftp.sh
#! /bin/bash
counter=$(/etc/init.d/sshd status|grep running|wc -l)if["${counter}"="0"]; then
/etc/init.d/sshd start
sleep 2
counter=$(/etc/init.d/sshd status|grep running|wc -l)if["${counter}"="0"]; then
/etc/init.d/keepalived stop
fi
fi
[ root@sftp-test01 keepalived-1.3.2]# chmod 755/data/chk_sftp.sh
3 )Keepalivedは両方のマシンで開始する必要があります
[ root@sftp-test01 ~]# /etc/init.d/keepalived start
[ root@sftp-test02 ~]# /etc/init.d/keepalived start
起動後にsftpが見つかりました-test01にはすでにvipリソースがあります
[ root@sftp-test01 ~]# ip addr
1: lo:<LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0:<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 02:f6:cb:83:ad:03 brd ff:ff:ff:ff:ff:ff
inet 172.16.51.191/24 brd 172.16.51.255 scope global eth0
inet 172.16.51.193/32 scope global eth0
inet6 fe80::f6:cbff:fe83:ad03/64 scope link
valid_lft forever preferred_lft forever
4 )高可用性テスト:
- > 最初にsftpを閉じます-test01マシンのKeepalivedサービスは、VIPリソースが見つかると、自動的にsftpにドリフトします。-test02マシンでは引き続きサービスが提供されます。
sftpの場合-test01マシンのKeepalivedサービスが復元された後、VIPリソースは自動的に差し戻されます。
- > sftpを閉じる-test01マシンのsshサービスは、スクリプトを介して自動的にsshサービスを開始します。起動に失敗すると、Keepalivedサービスが強制的にシャットダウンされ、VIPリソースのドリフトが実現します。
注意:
FileZillaクライアントで172を使用する.16.51.接続する193vip。 FileZillaクライアントに含めることができます"ファイル"造り付け"新しいサイト"、プロトコル「SFTP
ログインタイプ:通常
=====================================================================
上記の双方向リアルタイム同期高可用性ソリューションの実装後、ftpディレクトリにアップロードされたファイルのステータスに少し問題があることがわかりました。一部のファイルがアップロードされた後、サイズが大幅に変更されたため、ファイルが破損して開くことができませんでした。
その後、双方向のリアルタイム同期戦略が終了し、1台のマシンへのファイルのアップロードは問題ありません。これは、rsync + inotifyの双方向のリアルタイム同期が原因であると判断されます。
新しい調整済みプラン:
vipリソースを監視するスクリプトを作成します。vipがどのマシン上にある場合は、このマシンから別のマシンへのrsync一方向同期操作を実行し、バックグラウンドでスクリプトを実行します(スクリプトが常にループステートメントを介して実行されるようにするため)
元のrsyncをあきらめる+双方向のリアルタイム同期スクリプトをInotifyします!
スクリプトの内容は次のとおりです。
停止する前に同期する+Inotifyはスクリプトをリアルタイムで監視し、2台のマシン間の相互信頼関係を確立します。
1 )最初のマシンsftp-test01の操作
[ root@sign-test01 ~]# cat /data/script/sftp_vip_monit.sh
#! /bin/bash
while["1"="1"]do
NUM=`ip addr|grep 172.16.51.193|wc -l`if[ $NUM -eq 0];then
echo "vip is not at this server">/dev/null2>&1
fi
if[ $NUM -eq 1];then
/usr/bin/rsync -e "ssh -p22"-avpgolr --progress --delete-before /data/sftp/mysftp/ [email protected]:/data/sftp/mysftp/
fi
done
[ root@sign-test01 ~]# chmod 755/data/script/sftp_vip_monit.sh
[ root@sign-test01 ~]# nohup sh /data/script/sftp_vip_monit.sh &//ctrlを押す+cが終了します[root@sign-test01 ~]# ps -ef|grep monit
root 1058122167019:42 pts/000:00:00 grep monit
root 151131817:15?00:13:00 sh sftp_vip_monit.sh
2 )2番目のマシンsftp-test02
[ root@sign-test02 ~]# cat /data/script/sftp_vip_monit.sh
#! /bin/bash
while["1"="1"]do
NUM=`ip addr|grep 172.16.51.193|wc -l`if[ $NUM -eq 0];then
echo "vip is not at this server">/dev/null2>&1
fi
if[ $NUM -eq 1];then
/usr/bin/rsync -e "ssh -p22"-avpgolr --progress --delete-before /data/sftp/mysftp/ [email protected]:/data/sftp/mysftp/
fi
done
[ root@sign-test02 ~]# chmod 755/data/script/sftp_vip_monit.sh
[ root@sign-test02 ~]# nohup sh /data/script/sftp_vip_monit.sh &//ctrlを押す+cが終了します[root@sign-test02 ~]# ps -ef|grep monit
root 1058122167019:42 pts/000:00:00 grep monit
root 151131817:15?00:13:00 sh sftp_vip_monit.sh
Recommended Posts