Ubuntu16.04でシェルアクセスなしでSFTPを有効にする方法
序章
SFTP は、 S SH F ile T ransfer Protocolの略です。 その名前が示すように、暗号化されたSSH接続を使用してサーバーにファイルを転送する安全な方法です。 名前にもかかわらず、それは FTP ( F ile T ransfer P rotocol)とは完全に異なるプロトコルですが、現代では広くサポートされていますFTPクライアント。
SFTPはデフォルトで使用可能であり、SSHアクセスが有効になっているすべてのサーバーで追加の構成はありません。 安全で使いやすいですが、欠点があります。標準構成では、SSHサーバーは、システム上のアカウントを持つすべてのユーザーにファイル転送アクセスとターミナルシェルアクセスを許可します。
場合によっては、特定のユーザーのみにファイル転送を許可し、SSHアクセスを許可しないようにすることができます。 このチュートリアルでは、SSHデーモンを設定して、SFTPアクセスを1つのディレクトリに制限し、ユーザーごとにSSHアクセスを許可しません。
前提条件
このチュートリアルに従うには、次のものが必要です。
- この初期サーバーセットアップチュートリアルでセットアップされた1つのUbuntu16.04サーバー。これには、sudo非rootユーザーとファイアウォールが含まれます。
ステップ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
root に同じディレクトリへの書き込み権限を付与し、他のユーザーに読み取りと実行の権限のみを付与します。
- sudo chmod 755 /var/sftp
の所有権を変更します uploads
sammyfilesへのディレクトリ。
- sudo chown sammyfiles:sammyfiles /var/sftp/uploads
ディレクトリ構造が整ったので、SSHサーバー自体を構成できます。
ステップ3—1つのディレクトリへのアクセスを制限する
このステップでは、SSHサーバー構成を変更して、 sammyfiles のターミナルアクセスを禁止しますが、ファイル転送アクセスは許可します。
を使用してSSHサーバー構成ファイルを開きます nano
またはお気に入りのテキストエディタ。
- 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サーバーの実行を強制し、シェルアクセスを禁止します。PasswordAuthentication yes
このユーザーのパスワード認証を許可します。ChrootDirectory /var/sftp/
ユーザーがそれ以外のものへのアクセスを許可されないようにします/var/sftp
ディレクトリ。 chrootの詳細については、このchrootチュートリアルをご覧ください。AllowAgentForwarding no
,AllowTcpForwarding no
. とX11Forwarding no
このユーザーのポート転送、トンネリング、およびX11転送を無効にします。
この一連のコマンドは、 Match User
、コピーして、さまざまなユーザーに対して繰り返すこともできます。 のユーザー名を必ず変更してください Match User
それに応じて行。
注:省略できます PasswordAuthentication yes
代わりに、セキュリティを強化するためにSSHキーアクセスを設定します。 SSH Essentials:SSHサーバー、クライアント、およびキーの操作チュートリアルのパブリックSSHキーのコピーセクションに従ってください。 ユーザーのシェルアクセスを無効にする前に、必ずこれを行ってください。
次のステップでは、パスワードアクセスを使用してローカルでSSHを使用して構成をテストしますが、SSHキーを設定する場合は、代わりにユーザーのキーペアを使用してコンピューターにアクセスする必要があります。
構成の変更を適用するには、サービスを再起動します。
- 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アドレスへのアクセスを制限したりするなど、より複雑な構成スキームを使用できます。 追加の構成オプションの例と可能なディレクティブの説明は、 OpenSSHCookbookにあります。 SSHで問題が発生した場合は、このSSHシリーズのトラブルシューティングを使用してデバッグおよび修正できます。