前書き
SFTPは、SSHFileTransferProtocolを表します。 その名前が示すように、暗号化されたSSH接続を使用してマシン間でファイルを転送する安全な方法です。 名前にもかかわらず、これはFTP(FileTransferProtocol)とは完全に異なるプロトコルですが、最新のFTPクライアントで広くサポートされています。
SFTPは、SSHアクセスが有効になっているすべてのサーバーで追加設定なしでデフォルトで利用可能です。 安全で使いやすいですが、欠点があります。標準構成では、SSHサーバーはシステム上のアカウントを持つすべてのユーザーにファイル転送アクセスとターミナルシェルアクセスを許可します。
場合によっては、特定のユーザーのみにファイル転送を許可し、SSHアクセスは許可しないこともできます。 このチュートリアルでは、SSHデーモンを設定して、SFTPアクセスを1つのディレクトリに制限し、ユーザーごとにSSHアクセスを許可しません。
前提条件
このチュートリアルを実行するには、Ubuntu 18.04サーバーにアクセスする必要があります。 このサーバーには、sudo
権限を持つroot以外のユーザーと、ファイアウォールが有効になっている必要があります。 これを設定するためのヘルプについては、Initial Server Setup Guide for Ubuntu 18.04に従ってください。
[[step-1 -—- creating-a-new-user]] ==ステップ1—新しいユーザーの作成
最初に、サーバーへのファイル転送アクセスのみが許可される新しいユーザーを作成します。 ここでは、ユーザー名sammyfilesを使用していますが、任意のユーザー名を使用できます。
sudo adduser sammyfiles
アカウントのパスワードを作成するよう求められ、その後にユーザーに関する情報がいくつか表示されます。 ユーザー情報はオプションであるため、ENTER
を押してこれらのフィールドを空白のままにすることができます。
これで、制限されたディレクトリへのアクセスが許可される新しいユーザーが作成されました。 次の手順では、ファイル転送用のディレクトリを作成し、必要な権限を設定します。
[[step-2 -—- creating-a-directory-for-file-transfers]] ==ステップ2—ファイル転送用のディレクトリの作成
1つのディレクトリへのSFTPアクセスを制限するには、まずディレクトリがSSHサーバーの権限要件に準拠していることを確認する必要があります。これは非常に特殊です。
具体的には、ディレクトリ自体と、ファイルシステムツリー内のその上のすべてのディレクトリは、rootが所有している必要があり、他のユーザーが書き込みを行うことはできません。 したがって、ホームディレクトリはrootではなくユーザーが所有しているため、ユーザーのホームディレクトリへのアクセスを制限することはできません。
[.note]#Note: OpenSSHの一部のバージョンには、ディレクトリ構造と所有権に関するそのような厳密な要件はありませんが、ほとんどの最新のLinuxディストリビューション(Ubuntu 18.04を含む)にはあります。
#
この所有権の問題を回避する方法はいくつかあります。 このチュートリアルでは、/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サーバー自体を構成できます。
[[step-3 -—- restricting-access-to-one-directory]] ==ステップ3—1つのディレクトリへのアクセスを制限する
この手順では、SSHサーバーの構成を変更して、sammyfilesのターミナルアクセスを許可せず、ファイル転送アクセスを許可します。
nano
またはお気に入りのテキストエディタを使用して、SSHサーバー構成ファイルを開きます。
sudo nano /etc/ssh/sshd_config
ファイルの一番下までスクロールし、次の構成スニペットを追加します。
/etc/ssh/sshd_config
. . .
Match User sammyfiles
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
ディレクトリ以外へのアクセスを許可されないようにします。 -
AllowAgentForwarding no
、AllowTcpForwarding no
。X11Forwarding no
は、このユーザーのポート転送、トンネリング、およびX11転送を無効にします。
Match User
で始まるこの一連のコマンドは、さまざまなユーザーに対してコピーして繰り返すこともできます。 それに応じて、Match User
行のユーザー名を必ず変更してください。
[。注意]##
Note:PasswordAuthentication yes
行を省略し、代わりにセキュリティを強化するためにSSHキーアクセスを設定できます。 これを行うには、SSH Essentials: Working with SSH Servers, Clients, and KeysチュートリアルのCopying your Public SSH Keyセクションに従ってください。 ユーザーのシェルアクセスを無効にする前に、必ずこれを実行してください。
次のステップでは、パスワードアクセスを使用してローカルにSSHで接続することで構成をテストしますが、SSHキーをセットアップする場合は、代わりにユーザーのキーペアでコンピューターにアクセスする必要があります。
構成の変更を適用するには、サービスを再起動します。
sudo systemctl restart sshd
これで、sammyfilesのみのファイル転送へのアクセスを制限するようにSSHサーバーを構成しました。 最後のステップは、構成をテストして、意図したとおりに機能することを確認することです。
[[step-4 -—- verifying-the-configuration]] ==ステップ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アドレスへのアクセスを制限したりするなど、より複雑な構成スキームを使用できます。 追加の構成オプションの例と可能なディレクティブの説明は、OpenSSH Cookbookにあります。 SSHで問題が発生した場合は、このtroubleshooting SSH seriesを使用してデバッグおよび修正できます。