Ubuntu 16.04でシェルアクセスなしでSFTPを有効にする方法
Ubuntu 16.04を使用していませんか?別のバージョンやディストリビューションを選択してください。
紹介
SFTPはSSH File Transfer Protocolの略です。その名の通り、SSHの暗号化接続を使用してサーバーにファイルを安全に転送する方法です。名前に反して、FTP(File Transfer Protocol)とは完全に異なるプロトコルですが、現代のFTPクライアントによって広くサポートされています。
SFTPは、SSHアクセスが有効なすべてのサーバーで追加の設定なしにデフォルトで利用可能です。安全で使いやすいですが、欠点があります。標準の設定では、SSHサーバーはシステム上のアカウントを持つすべてのユーザーにファイル転送アクセスとターミナルシェルアクセスを付与します。
場合によっては、特定のユーザーのみファイル転送を許可し、SSHアクセスを許可しないようにしたいことがあります。このチュートリアルでは、SSHデーモンを設定して、ユーザーごとにSSHアクセスが許可されない1つのディレクトリへのSFTPアクセスを制限します。
前提条件
このチュートリアルに従うためには、次のものが必要です:
- sudo非ルートユーザーとファイアウォールを含む、この初期サーバーセットアップチュートリアルで設定されたUbuntu 16.04サーバー1台。
ステップ1 — 新しいユーザーの作成
まず、新しいユーザーを作成します。このユーザーにはサーバーへのファイル転送アクセスのみが付与されます。ここではユーザー名をsammyfilesとしていますが、お好きなユーザー名を使用しても構いません。
- sudo adduser sammyfiles
アカウントのパスワードを作成するように指示され、その後ユーザーに関する情報が求められます。ユーザー情報はオプションなので、ENTERを押してその項目を空白のままにすることができます。
あなたは現在、制限されたディレクトリへのアクセスが許可される新しいユーザーを作成しました。次のステップでは、ファイル転送のためのディレクトリを作成し、必要な権限を設定します。
ステップ2 — ファイル転送用のディレクトリを作成する
SFTPアクセスを1つのディレクトリに制限するためには、まずそのディレクトリがSSHサーバーの権限要件を満たしていることを確認する必要があります。これらの要件は非常に特定のものです。
具体的には、ディレクトリ自体とファイルシステムツリー内のその上のすべてのディレクトリはrootが所有し、他の誰も書き込みできないようにする必要があります。したがって、ユーザーのホームディレクトリに制限付きアクセスを単純に与えることはできません。なぜなら、ホームディレクトリはユーザーが所有しており、rootではないからです。
注: OpenSSHの一部のバージョンでは、ディレクトリ構造と所有権に対してそれほど厳密な要件はありませんが、ほとんどの現代のLinuxディストリビューション(Ubuntu 16.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
ルートに同じディレクトリへの書き込み権限を与え、他のユーザーには読み取りおよび実行権限のみを付与します。
- sudo chmod 755 /var/sftp
uploadsディレクトリの所有権をsammyfilesに変更してください。
- sudo chown sammyfiles:sammyfiles /var/sftp/uploads
ディレクトリ構造が整ったので、SSHサーバー自体を設定できます。
ステップ3 — 1つのディレクトリへのアクセスを制限する
このステップでは、sammyfiles のターミナルアクセスを無効にし、ファイル転送アクセスを許可するようにSSHサーバーの設定を変更します。
お好みのテキストエディタを使用して、nano でSSHサーバーの設定ファイルを開いてください。
- sudo nano /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サーバーを実行するよう強制し、シェルアクセスを禁止します。パスワード認証 yesはこのユーザーのためのパスワード認証を許可します。ChrootDirectory /var/sftp/は、ユーザーが/var/sftpディレクトリを超えてアクセスできないことを保証します。このchrootチュートリアルでchrootについてもっと学ぶことができます。AllowAgentForwarding no,AllowTcpForwarding no、およびX11Forwarding noは、このユーザーのポートフォワーディング、トンネリング、X11フォワーディングを無効にします。
このコマンドのセットは、Match Userから始まり、他のユーザーについてもコピーして繰り返すことができます。Match Userの行のユーザー名を適切に変更することを忘れないでください。
注意: PasswordAuthentication yes 行は省略でき、代わりにSSHキーアクセスを設定することでセキュリティを強化できます。これを行うには、SSH Essential: SSHサーバー、クライアント、およびキーの操作に関するチュートリアルの公開SSHキーのコピーセクションを参照してください。ユーザーのシェルアクセスを無効にする前に、必ずこれを実行してください。
次のステップでは、パスワードアクセスでローカルにSSH接続して構成をテストしますが、SSHキーを設定した場合は、ユーザーのキー ペアを持つコンピュータへのアクセスが必要になります。
設定変更を適用するには、サービスを再起動してください。
- sudo systemctl restart sshd
あなたは今、SSHサーバーを設定して、ファイル転送へのアクセスをsammyfilesのみに制限しました。最後のステップは、設定が意図した通りに機能することを確認するためのテストです。
ステップ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に関して問題が発生した場合は、このトラブルシューティングSSHシリーズでデバッグし、修正することができます。
