前書き
SFTPは S SH を表しますF ile T ransfer P rotocol。 その名前が示すように、暗号化されたSSH接続を使用してファイルをサーバーに転送する安全な方法です。 名前にもかかわらず、それはhttps://www.digitalocean.com/community/tutorials/what-is-ftp-and-how-is-it-used[FTP]( F ile とは完全に異なるプロトコルです T ransfer P ** rotocol)。ただし、最新のFTPクライアントでは広くサポートされています。
SFTPは、SSHアクセスが有効になっているすべてのサーバーで追加設定なしでデフォルトで利用可能です。 安全で使いやすいですが、欠点があります。標準構成では、SSHサーバーはシステム上のアカウントを持つすべてのユーザーにファイル転送アクセスとターミナルシェルアクセスを許可します。
場合によっては、特定のユーザーのみにファイル転送を許可し、SSHアクセスは許可しないこともできます。 このチュートリアルでは、SSHデーモンを設定して、SFTPアクセスを1つのディレクトリに制限し、ユーザーごとにSSHアクセスを許可しません。
前提条件
このチュートリアルを実行するには、次のものが必要です。
-
https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-16-04 [この初期サーバーセットアップチュートリアル]でセットアップされた1つのUbuntu 16.04サーバー(sudo非rootユーザーとファイアウォール。
手順1-新しいユーザーの作成
まず、サーバーへのファイル転送アクセスのみが許可される新しいユーザーを作成します。 ここでは、ユーザー名* sammyfiles *を使用していますが、任意のユーザー名を使用できます。
sudo adduser
アカウントのパスワードを作成するよう求められ、その後にユーザーに関する情報がいくつか表示されます。 ユーザー情報はオプションであるため、「+ ENTER +」を押してこれらのフィールドを空白のままにすることができます。
これで、制限されたディレクトリへのアクセスが許可される新しいユーザーが作成されました。 次の手順では、ファイル転送用のディレクトリを作成し、必要な権限を設定します。
ステップ2-ファイル転送用のディレクトリの作成
1つのディレクトリへのSFTPアクセスを制限するには、まずディレクトリがSSHサーバーの権限要件に準拠していることを確認する必要があります。これは非常に特殊です。
具体的には、ファイルシステムツリー内のディレクトリ自体とその上のすべてのディレクトリは、* root が所有し、他のユーザーが書き込みできないようにする必要があります。 したがって、ホームディレクトリは root *ではなくユーザーが所有しているため、ユーザーのホームディレクトリへのアクセスを単純に制限することはできません。
この所有権の問題を回避する方法はいくつかあります。 このチュートリアルでは、ターゲットのアップロードディレクトリとして「+ / var / sftp / uploads 」を作成して使用します。 ` / var / sftp `は* root *が所有し、他のユーザーは書き込みできません。サブディレクトリ ` / var / sftp / uploads +`は* sammyfiles *が所有するため、ユーザーはそこにファイルをアップロードできます。
まず、ディレクトリを作成します。
sudo mkdir -p /var/sftp/uploads
`+ / var / sftp +`の所有者を* root *に設定します。
sudo chown root:root /var/sftp
-
root *に同じディレクトリへの書き込み権限を与え、他のユーザーには読み取りと実行の権限のみを与えます。
sudo chmod 755 /var/sftp
`+ uploads +`ディレクトリの所有権を* sammyfiles *に変更します。
sudo chown sammyfiles:sammyfiles /var/sftp/uploads
ディレクトリ構造が整ったので、SSHサーバー自体を構成できます。
ステップ3-1つのディレクトリへのアクセスを制限する
この手順では、SSHサーバーの設定を変更して、* sammyファイル*のターミナルアクセスを無効にし、ファイル転送アクセスを許可します。
`+ nano +`またはお好みのテキストエディターを使用してSSHサーバー設定ファイルを開きます。
sudo nano /etc/ssh/sshd_config
ファイルの一番下までスクロールし、次の構成スニペットを追加します。
/ etc / ssh / sshd_config
. . .
Match User
ForceCommand internal-sftp
PasswordAuthentication yes
ChrootDirectory /var/sftp
PermitTunnel no
AllowAgentForwarding no
AllowTcpForwarding no
X11Forwarding no
次に、ファイルを保存して閉じます。
これらの各ディレクティブの機能は次のとおりです。
-
`+ Match User +`は、指定されたユーザーにのみ次のコマンドを適用するようSSHサーバーに指示します。 ここでは、* sammyfiles *を指定します。
-
`+ ForceCommand internal-sftp +`は、ログイン時にSSHサーバーに強制的にSFTPサーバーを実行させ、シェルアクセスを許可しません。
-
`+ PasswordAuthentication yes +`は、このユーザーのパスワード認証を許可します。
-
`+ ChrootDirectory / var / sftp / `は、ユーザーが ` / var / sftp +`ディレクトリ以外にアクセスできないようにします。 chrootの詳細については、https://www.digitalocean.com/community/tutorials/how-to-configure-chroot-environments-for-testing-on-an-ubuntu-12-04-vps [このchrootチュートリアル]をご覧ください。 ]。
-
+ AllowAgentForwarding no +
、+ AllowTcpForwarding no +
。 また、「+ X11 Forwarding no」は、このユーザーのポート転送、トンネリング、およびX11転送を無効にしました。
`+ Match User `で始まるこのコマンドセットは、コピーして別のユーザーに対しても繰り返すことができます。 それに応じて、 ` Match User +`行のユーザー名を必ず変更してください。
構成の変更を適用するには、サービスを再起動します。
sudo systemctl restart sshd
これで、* sammyfiles *のみのファイル転送へのアクセスを制限するようにSSHサーバーを構成しました。 最後のステップは、構成をテストして、意図したとおりに機能することを確認することです。
ステップ4-構成の検証
新しい* sammyfiles *ユーザーがファイルのみを転送できるようにします。
通常のシェルアクセスを使用して* sammyfiles *としてサーバーにログインすることはできなくなります。 試してみよう:
ssh sammyfiles@localhost
元のプロンプトに戻る前に、次のメッセージが表示されます。
Error messageThis service allows sftp connections only.
Connection to localhost closed.
つまり、* sammyfiles *はSSHを使用してサーバーシェルにアクセスできなくなります。
次に、ユーザーがファイル転送のためにSFTPに正常にアクセスできるかどうかを確認しましょう。
sftp sammyfiles@localhost
このコマンドは、エラーメッセージの代わりに、対話型プロンプトで成功したログインメッセージを表示します。
SFTP promptConnected to localhost.
sftp>
プロンプトで `+ ls +`を使用してディレクトリの内容を一覧表示できます。
ls
これにより、前の手順で作成された `+ uploads `ディレクトリが表示され、 ` sftp> +`プロンプトに戻ります。
SFTP file list outputuploads
ユーザーが実際にこのディレクトリに制限されており、その上のディレクトリにアクセスできないことを確認するには、ディレクトリをその上のディレクトリに変更してみてください。
cd ..
このコマンドはエラーにはなりませんが、以前のようにディレクトリの内容をリストしても変更は表示されず、ユーザーが親ディレクトリに切り替えることができなかったことを証明します。
これで、制限された構成が意図したとおりに機能することを確認できました。 新しく作成された* sammyfiles *ユーザーは、ファイル転送にSFTPプロトコルを使用する場合にのみサーバーにアクセスでき、完全なシェルにアクセスすることはできません。
結論
完全なシェルアクセスのないサーバー上の単一ディレクトリへのSFTPのみのアクセスにユーザーを制限しました。 このチュートリアルでは、簡潔にするために1つのディレクトリと1つのユーザーのみを使用していますが、この例を複数のユーザーと複数のディレクトリに拡張できます。
SSHサーバーでは、グループまたは複数のユーザーへのアクセスを一度に制限したり、特定のIPアドレスへのアクセスを制限したりするなど、より複雑な構成スキームを使用できます。 追加の構成オプションの例と可能なディレクティブの説明は、https://en.wikibooks.org/wiki/OpenSSH/Cookbook/File_Transfer_with_SFTP [OpenSSH Cookbook]にあります。 SSHで問題が発生した場合は、https://www.digitalocean.com/community/tutorial_series/how-to-troubleshoot-ssh [SSHシリーズのトラブルシューティング]で問題をデバッグおよび修正できます。