私はこの質問に対する実行可能な回答を探しましたが、ほとんどの回答には、なぜそれをしないのかに関するアドバイスが含まれています。ただし、これがシナリオであり、必要なものは次のとおりです。
コンソールアプリがあり、各ユーザーの.profileにアプリの起動コマンドがあり、アプリを起動するコマンドの直後に、システムからログアウトする「exit」コマンドがあります。私は、彼らが提供するインターフェースを介してこのコンソールアプリにアクセスできるようにしたいだけです。アプリは起動時に、アプリを通じてアクセスできるクライアントのリストをユーザーに提示します。各クライアントには独自のデータディレクトリがあります。ユーザーには、アクセスが必要なクライアントのみへのアクセスが許可されます。
ここに問題があります:ユーザーにSSHアクセスを許可すると、SFTPクライアントを使用してログインすることもできます。これにより、アプリのデータディレクトリに直接アクセスできるようになります。これは、彼らはアクセスすべきではないデータディレクトリにアクセスします。
これはtelnet/FTPの組み合わせを使用する場合はとても簡単なことでしたが、インターネット上のどこからでもユーザーにアクセスを許可したいので、SFTPからユーザーを遮断する方法を見つけることができませんでした。それでも、アプリを実行できるシェルへのアクセスを許可します。
明らかでない場合、次の回答は、サーバーへのシェルアクセス権を持つユーザーがSFTPを使用できないようにするsecureメソッドとしては意図されていません。それは外部の可視性からそれを無効にする方法を説明する答えにすぎません。ユーザーレベルのセキュリティについては、@ cpastおよび@Aleksi Torhamoからの回答を参照してください。セキュリティに焦点を当てている場合、この答えは適切ではありません。単純なサービスの可視性があなたの焦点である場合、これはあなたの答えです。
私たちは今、元の答えに続きます:
Sshd_configのsftpサポートをコメント化します(そしてもちろんsshd
を再起動します):
#Subsystem sftp /usr/lib/openssh/sftp-server
.profile
を使用してこれを実行しないでください。セキュリティがまったく提供されず、まったく何も制限されません!
.profile
のようにsshコマンドラインで実行するコマンドを指定するだけでバイパスできるため、ssh user@Host command
に何を入力してもかまいません。 ssh -t user@Host bash
を実行すると、通常のシェルアクセスを引き続き取得できます。
別の回答で述べたように、sftpサブシステムを無効にしてもまったく効果がありません。サブシステムは基本的にはコマンドの単なるエイリアスであり、sftp -s /path/to/sftp-executable user@Host
を実行することにより、引き続き通常のsftpを使用できます。
Cpastや一部のコメンターが言ったように、アクセスを制限するための適切なメカニズムを使用する必要があります。あれは、
sshd_config
でForceCommand
を使用command="..."
を.ssh/authorized_keys
で使用するノート:
command="..."
は1つのキーにのみ適用されるため、パスワードまたは別のキーを使用するユーザーのsshログインを制限しませんAllowTcpForwarding
など_sshd_config
no-port-forwarding
などの.ssh/authorized_keys
script -c 'command-the-user-wanted-to-run'
のように実行しますForceCommand
とcommand="..."
はどちらもユーザーのシェルを介してコマンドを実行するため、ユーザーのシェルがたとえばに設定されている場合は機能しません。 /bin/false
または/sbin/nologin
免責事項:私は決してこの問題の専門家ではないので、.profile
のことは安全ではないと言えますが、知りません。彼らは私が知る限り安全ですが、インターネットで最初に間違った人になることはありません。
SSHを有効にしたり、SFTPを無効にしたりすることは、グローバルでもユーザーごとでも可能です。
SSH経由でいくつかのgitリポジトリへのアクセスを許可したいので、個人的にこれが必要です。また、不要なシステムを無効にしたいのです。その場合、SFTPは必要ありません。
いくつかの方法で、すべてのユーザーのSFTPを無効にすることができます。
SSHが使用するSFTPデーモンは、Subsystem
キーワードを使用して構成できます。 sshd_config(5)
マニュアルから:
_Subsystem
Configures an external subsystem (e.g. file transfer daemon).
Arguments should be a subsystem name and a command (with optional
arguments) to execute upon subsystem request.
The command sftp-server(8) implements the “sftp” file transfer
subsystem.
Alternately the name “internal-sftp” implements an in-process
“sftp” server. This may simplify configurations using
ChrootDirectory to force a different filesystem root on clients.
By default no subsystems are defined.
_
最後の行は、「sftp」のサブシステムを定義しないことで十分であることを示唆しています。
SSHが使用するSFTPデーモンを使用できないものに設定することにより、SFTPを無効にすることもできます。たとえば、「sftp」サブシステムを_/bin/false
_に構成します。
_Subsystem sftp /bin/false
_
何かがSFTP経由でログインしようとすると、SSHデーモンは「sftpデーモン」_/bin/false
_を生成しようとします。 _/bin/false
_プログラムは1つの処理のみを実行し、エラーコードを返します。 SFTP接続の試行は事実上拒否されます。
ユーザー、グループ、またはその他のいくつかの基準ごとにSFTPを無効にすることもできます。
これは、ユーザーに通常のシェルプロンプトを表示させたい場合には機能しません。シェルアクセスがあれば、ほとんどのものを回避できるため、意味がありません。 特定のプログラムへのアクセスのみを許可する場合にのみ機能します。
一連のユーザーに一致させるには、Match
キーワードを使用してSSHを構成できます。 sshd_config(5)
マニュアルから:
_Match
...
The arguments to Match are one or more criteria-pattern pairs or the
single token All which matches all criteria. The available criteria
are User, Group, Host, LocalAddress, LocalPort, and Address. The
match patterns may consist of single entries or comma-separated
lists and may use the wildcard and negation operators described in
the PATTERNS section of ssh_config(5).
...
_
いくつかの例:
Match User eva
_は「eva」ユーザーに一致しますMatch User stephen,maria
_は、「stephen」および「maria」ユーザーに一致しますMatch Group wheel,adams,simpsons
_は、「wheel」、「adams」、「simpsons」グループに一致しますさらに情報が必要な場合は、sshd_config(5)
マニュアルにロードがあります。
通常、SSH経由で接続するときにユーザーのログインシェルを取得しますが、SSHは特定のコマンドを強制するように構成できます。コマンドは、SFTPを含むすべてのSSH接続に対して強制されるため、必要なコマンドを強制するオプションがある場合があります。
強制するコマンドは、ForceCommand
キーワードを使用して構成できます。 sshd_config(5)
マニュアルから:
_ForceCommand
Forces the execution of the command specified by ForceCommand,
ignoring any command supplied by the client and ~/.ssh/rc if
present. The command is invoked by using the user's login Shell
with the -c option. This applies to Shell, command, or subsystem
execution. It is most useful inside a Match block. The command
originally supplied by the client is available in the
SSH_ORIGINAL_COMMAND environment variable. Specifying a command of
“internal-sftp” will force the use of an in-process sftp server that
requires no support files when used with ChrootDirectory. The
default is “none”.
_
したがって、_ForceCommand <your command>
_を使用して、必要な制約コマンドを強制できます。例えば:
_Match User kim
ForceCommand echo 'successful login man, congrats'
_
Gitにアクセスを許可する場合、ユーザーには_git-Shell
_へのアクセス権のみが必要です。これは、いくつかのセキュリティオプションとともに、私のgitユーザーに対してSFTPを無効にするセクションです。
_Match Group git
# have to do this instead of setting the login Shell to `git-Shell`,
# to disable SFTP
ForceCommand /usr/bin/git-Shell -c "$SSH_ORIGINAL_COMMAND"
# disable stuff we don't need
AllowAgentForwarding no
AllowTcpForwarding no
AllowStreamLocalForwarding no
PermitOpen none
PermitTunnel no
PermitTTY no
X11Forwarding no
_