CentOS7.9ベースのSFTPサーバー構築(ユーザースクリプト作成あり)

バックグラウンド:

·既存の方法:

1. 当社はFTPサーバーを介して外部協力会社に研究開発データを送信し、外部協力会社はデータを当社に送信します。

2. 従業員は、管理者から渡されたデータを外部ネットワーク上からダウンロード、または会社に転送します。

問題点1:既存のFTPサーバーは送信時にデータを暗号化していないため、漏洩のリスクがある。データパケットを手動で暗号化して送信し、相手がデータを受信した後に復号化すると、双方にとって時間がかかりすぎます

·問題 2: 既存の FTP サーバーがパッシブ モードで実行されており、多すぎるポート、または IP アドレス全体を占有している

·解決策: SFTP サーバーを構築することで、データが暗号化され、占有される TCP ポートは 1 つだけになります

ビルドプロセス:

·システム: CentOS7.9、グラフィカルインターフェイスなしの最小インストールによる

  1. まずsftpユーザーグループを作成し、グループ単位で一元管理します

groupadd sftp
  1. sftpディレクトリを作成して権限を設定する

# 创建sftp目录
mkdir /sftp

# 设置目录所有者(如果需要实现ChrootDirectory功能,则目录所有者必须为root)
chown root:sftp /sftp

# 设置目录权限(如果需要实现ChrootDirectory功能,则目录权限代码不能高于755)
chmod 755 /sftp
  1. SSH設定ファイルを編集する

# 备份配置文件
cp /etc/ssh/sshd_config{,.bak}

# 禁用DNS反向解析、GSSAPI认证功能,防止登录SSH过慢
sed -ri 's/#UseDNS yes/UseDNS no/' /etc/ssh/sshd_config
sed -ri 's/GSSAPIAuthentication yes/GSSAPIAuthentication no/' /etc/ssh/sshd_config

# 注释掉配置文件自带的Subsystem sftp /usr/libexec/openssh/sftp-server条目
sed -ri 's/Subsystem/# Subsystem/' /etc/ssh/sshd_config

# 添加Subsystem sftp internal-sftp条目
echo 'Subsystem sftp internal-sftp' >> /etc/ssh/sshd_config

# 针对用户组sftp匹配规则(多个组名称可用逗号分隔)(匹配用户可写为Match User 用户名)
echo 'Match Group sftp' >> /etc/ssh/sshd_config

# 规则1:禁止sftp组使用X11图形功能
echo '       X11Forwarding no' >> /etc/ssh/sshd_config

# 规则2:禁止sftp组使用端口转发功能(外部用户可将sftp作为跳板访问公司内部其他服务器,存在隐患)
echo '       AllowTcpForwarding no' >> /etc/ssh/sshd_config

# 规则3:强制sftp组使用sftp组件提供的命令,禁止运行自定义命令
echo '       ForceCommand internal-sftp' >> /etc/ssh/sshd_config

# 规则4:用户登录后,将其锁定在其根目录,防止其访问到其他用户的目录
echo '       ChrootDirectory /sftp/%u' >> /etc/ssh/sshd_config

# 重启sshd服务使刚才的配置生效,并查看服务是否运行正常
systemctl restart sshd; systemctl status sshd
  1. ユーザーの作成 (手動構成は面倒なため、ユーザー、ユーザー ディレクトリを自動的に作成し、アクセス許可を構成するために次のスクリプトが作成されます)

# 创建自定义程序
vi /usr/bin/sftpadd
# 将以下脚本写入到自定义程序中(从#!/bin/bash开始顶格写)

#!/bin/bash

# 检测脚本是否以Root或sudo权限运行
if [ $UID -ne 0 ];then
    echo -e "Must run with root or sudo privileges!"
    exit 0
fi

# --help帮助信息
if [[ "$1" == "--help" ]] || [ $# -eq 0 ];then
    echo -e "\nUsage: sftpadd [user name] [user passwd] [permissions]"
    echo -e "\nList Of Parameter:"
    echo -e "    username:     sftp user name"
    echo -e "    userpasswd:   sftp user password"
    echo -e "    permissions:  u: mkdir upload, allow reading and writing"
    echo -e "                  d: mkdir download, read-only"
    echo -e "\nExamples 1:"
    echo -e "    command:      sftpadd tom 123456 d"
    echo -e "    action:       Create user tom, only allow download"
    echo -e "\nExamples 2:"
    echo -e "    command:      sftpadd jerry 123456 ud"
    echo -e "    action:       Create user jerry, allow upload and download\n"
    exit 0
fi

# 校验传入参数是否正确
if [ $# -ne 3 ]; then
    echo -e "Parameter error, Please use sftpadd --help"
    exit 0
fi

# 提取传入值
user_name="$1"; user_passwd="$2"; user_permissions="$3"

# 校验用户名是否重复存在
if grep -q "$user_name" /etc/passwd; then
    echo -e "User already exists!"
    exit 0
fi

# 校验密码是否小于6位
if [ $(echo ${#user_passwd}) -lt 6 ]; then
    echo -e "User password is less than 6 digits!"
    exit 0
fi

# 校验传入参数是否包含非u/d字符
if [[ "$(echo $3 | sed -e 's/u//' -e 's/d//')" != "" ]]; then
    echo -e "Permission parameter contains illegal characters! Please use sftpadd --help"
    exit 0
fi

# 创建用户及密码、将用户加入到sftp组、禁止其通过ssh客户端软件登录到服务器
useradd -g sftp -s /sbin/nologin -M "$user_name" >> /dev/null 2>&1
echo -e "    Create User Complete:           $user_name"
echo "$user_passwd" | passwd --stdin "$user_name" >> /dev/null 2>&1
echo -e "    Create User Password:           $user_passwd"

# 生成用户目录的路径
upload_path="/sftp/$user_name/upload/"
download_path="/sftp/$user_name/download/"

# 创建并回显用户目录
if [[ "$3" =~ "u" ]];then
    mkdir -p "$upload_path"
    chown "$user_name:sftp" "$upload_path"
    chmod 700 "$upload_path"
    echo -e "    Create the upload directory:    $upload_path"
fi

if [[ "$3" =~ "d" ]];then
    mkdir -p "$download_path"
    chown "$user_name:sftp" "$download_path"
    chmod 500 "$download_path"
    echo -e "    Create the download directory:  $download_path"
fi

exit 0

# 对自定义程序添加可执行权
chmod +x sftpadd

·使用方法とパラメータ:

  1. sftpadd または sftpadd --help を実行すると、詳細なプロンプトが表示されます

  1. 作成したユーザーはsshクライアントログイン機能(ログイン直後のフラッシュバック)を持たず、sftpログインのみに使用できます。

  1. プログラムは、固定モードでユーザー ディレクトリを自動的に作成します。作成中に u パラメーターが追加されると、アップロード ディレクトリが自動的に作成され、ユーザーはそこに読み書きできるようになります。d パラメーターが追加されると、ダウンロード ディレクトリが作成されます。自動的に作成され、ユーザーは読み取りのみにアクセスできます

使用方法例1:

外部の協力会社があり、当社にデータを転送し、パスワード 123456 でアカウント user1 を作成し、アップロード ディレクトリへの読み取りおよび書き込み権限を設定する必要があります。

コマンドを実行します: sftpadd user1 123456 u

プログラムはユーザー user1 とユーザー ディレクトリ /sftp/user1/upload を自動的に作成し、user1 にはアップロード ディレクトリへの読み取りおよび書き込み権限があります。

使用例2:

自社データは外部の協力会社にダウンロードしてもらう必要がありますが、ダウンロードディレクトリ内のファイルの操作(削除、名前変更、データの変更等)や、アカウント user2 のパスワード 123456 の作成、設定は禁止されています。ダウンロードに対して読み取り専用権限のみを付与するには

コマンドを実行します: sftpadd user2 123456 d

使用例3:

会社の従業員は、外部ネットワーク上でデータをアップロード/ダウンロードする必要があり、パスワード 123456 を持つアカウント user3 を作成します。アップロードに対する読み取りおよび書き込み権限と、ダウンロードに対する読み取り専用権限を持っています。Sftp サーバーは高い権限を持つ管理者によって制御されているため、user3 は外部データのみを会社に転送できますが、会社の内部データをプライベートに転送することはできません (データは、管理者がデータをダウンロード ディレクトリに配置した後にのみダウンロードできます)。

コマンドを実行します: sftp user3 123456 ud

5. 検証

sftp コマンドまたは WinSCP、Xshell、 FileZilla、Xftp、その他のツールを使用してサーバーにログインし、関連する設定を確認します。

· user3 がログインできるかどうかをテストする

sftp [email protected]コマンドを実行し、パスワードを入力してログインします。

ログイン後に user3 がルート ディレクトリにロックされているかどうかを確認します (他のユーザーのファイルにアクセスできません)

  1. ls / コマンドを実行し、user3 用に作成された /download/upload ディレクトリが表示されれば正常です

  1. 他のユーザーのディレクトリまたはシステムディレクトリが表示される場合は、sshd_config 設定ファイルの ChrootDirectory パラメータまたは /sftp ディレクトリの権限設定が間違っています。

user3 がダウンロード ディレクトリに対する読み取り専用権限を持っていることを確認します。

  1. mkdir /download/test コマンドを実行して、ダウンロード ディレクトリにテスト ディレクトリ test を作成してみます。

  1. 如果提示Permission denied则表示权限设置无误,因为用户对download目录只有只读权限

· 验证user3对upload目录是否具有读写权限

运行mkdir /upload/test 命令,尝试在upload目录创建一个测试目录test,如果未报错则表示权限设置无误,因为用户对upload目录拥有读写权限

6. 端口映射

· 将内网SFTP的22端口通过防火墙或是路由器映射到外网

注意:

  1. 请勿将外网IP的22端口映射到内网SFTP服务器的22端口,因为外网有专门的主机去攻击存在漏洞的服务器、或是暴力破解密码,其扫描全球IP的时间大概在5小时左右,服务器映射到外网后不超过1天就会被扫描到。应当采用不容易被猜到用途的端口号比如53110等,而不是直接采用22、或是60022、61022这种容易猜到作用的端口

  1. 一定要设置高强度密码,一方面用户密码被暴力破解后容易造成资料丢失、另一方面SSH组件存在安全漏洞的话,攻击者可能通过用户账户获取整个SFTP服务器的控制权

おすすめ

転載: blog.csdn.net/baishikele006/article/details/129766325