Info: Version 1.8.x is available.
Last modified: $Date: 2024-03-30 11:25:00 +0000 (Sat, 30 Mar 2024) $
SSHクライアントから提供された環境変数の内容に応じて、ダウンロード専用のSFTPサービスとアップロードも可能なSFTPサービスの2種類を単一のアカウントで使い分け、また、環境変数が提供されなかった場合にはシェルの実行を許可しないようにする手順について紹介します。
このページでは、SFTP用アカウントのユーザ名を sftp とします。
SFTP用アカウントのログインシェルを /bin/sftp-shell とします。
SFTP用のコンテンツを置くディレクトリを /var/sftp/ とします。
SFTPサーバのパス名を /usr/libexec/openssh/sftp-server とします。
useradd -s /bin/sftp-shell -d /var/sftp sftp passwd sftp |
以下の内容を /bin/sftp-shell として保存し、実行許可を与えます。
#! /bin/sh [ "$sftp_type" == "ro-sftp" ] && exec /bin/ro-sftp [ "$sftp_type" == "rw-sftp" ] && exec /bin/rw-sftp exit 1 |
以下の内容を /bin/rw-sftp および /bin/ro-sftp として保存し、実行許可を与えます。
#! /bin/sh umask 0022 exec /usr/libexec/openssh/sftp-server |
サーバ側の /etc/ssh/sshd_config の末尾に環境変数名を指定します。
AcceptEnv sftp_type |
クライアント側の /etc/ssh/ssh_config の末尾に環境変数名を指定します。
SendEnv sftp_type |
TOMOYO Linux をインストールしてから、以下のコマンドを実行して初期設定を行ってください。
/usr/lib/ccs/init_policy |
その後、 TOMOYO Linux カーネルで再起動する前に以下の操作を行ってください。
/bin/sftp-shell が実行された場合にはドメイン遷移が初期化されるようにするために、 /etc/ccs/exception_policy.conf に以下の内容を追加します。
initialize_domain /bin/sftp-shell |
SFTPコンテンツ用ディレクトリ以下をまとめて指定できるようにするために、 /etc/ccs/exception_policy.conf に以下の内容を追加します。
path_group SFTP_DIRS /var/sftp/\{\*\}/ path_group SFTP_FILES /var/sftp/\{\*\}/\* path_group SFTP_FILES /var/sftp/\* |
SFTPコンテンツの参照と更新ができるようにするために、 /etc/ccs/domain_policy.conf に以下の内容を追加します。
<kernel> /bin/sftp-shell <kernel> /bin/sftp-shell /bin/ro-sftp /usr/libexec/openssh/sftp-server allow_read @SFTP_FILES <kernel> /bin/sftp-shell /bin/rw-sftp /usr/libexec/openssh/sftp-server allow_read/write @SFTP_FILES allow_create @SFTP_FILES 0644 allow_unlink @SFTP_FILES allow_mkdir @SFTP_DIRS 0755 allow_rmdir @SFTP_DIRS allow_rename @SFTP_FILES @SFTP_FILES allow_rename @SFTP_DIRS @SFTP_DIRS allow_truncate @SFTP_FILES |
以上で準備は完了です。 TOMOYO Linux カーネルで再起動してください。
学習モードに切り替えます。
/usr/sbin/ccs-setprofile -r 1 '<kernel> /bin/sftp-shell' |
環境変数 sftp_type に ro-sftp を設定して、クライアントから sftp でアクセスしてください。このページでは、サーバのホスト名を server とします。
export sftp_type="ro-sftp" sftp sftp@server |
この時点では、プロセスには <kernel> /bin/sftp-shell /bin/ro-sftp /usr/libexec/openssh/sftp-server ドメインが割り当てられています。このドメインから適当に操作を行います。ただし、書込み操作は行わないでください。
環境変数 sftp_type に rw-sftp を設定して、クライアントから sftp でアクセスしてください。
export sftp_type="rw-sftp" sftp sftp@server |
この時点では、プロセスには <kernel> /bin/sftp-shell /bin/rw-sftp /usr/libexec/openssh/sftp-server ドメインが割り当てられています。このドメインから適当に操作を行います。書込み操作も行ってください。
強制モードに切り替えます。
/usr/sbin/ccs-setprofile -r 3 '<kernel> /bin/sftp-shell' |
ポリシーを保存します。
/usr/sbin/ccs-savepolicy |
親ドメインが異なる2つの sftp-server 用のドメインを作成し、片方にだけ書き込み許可を与えています。このプログラムはサンプルなので判りやすいキーワードを利用していますが、実際に使用する場合にはパスワードの代わりとなるので推測されないキーワードを利用してください。
共有ライブラリなど例外ポリシーの allow_read で許可されているファイルへのアクセスを制限したい場合、 ignore_global_allow_read という指定を行うことができます。
環境変数 SSH_CLIENT の内容に基づいて特定のIPアドレスやポート番号から接続してきたクライアントにはアップロードを許可し、それ以外のクライアントにはダウンロードのみ許可するという使い方もできます。