環境変数を用いてダウンロード専用SFTPとアップロードも可能なSFTPを単一アカウントで実現する
概要
SSHクライアントから提供された環境変数の内容に応じて、ダウンロード専用のSFTPサービスとアップロードも可能なSFTPサービスの2種類を単一のアカウントで使い分け、また、環境変数が提供されなかった場合にはシェルの実行を許可しないようにする手順について紹介します。
ステップ1:アカウントの作成
このページでは、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
ステップ2:使用するプログラムの作成
以下の内容を /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/rw-sftp と /bin/ro-sftp の内容は同一です。)
#! /bin/sh umask 0022 exec /usr/libexec/openssh/sftp-server
ステップ3:環境変数を渡すための設定
サーバ側の /etc/ssh/sshd_config の末尾に環境変数名を指定します。
AcceptEnv sftp_type
クライアント側の /etc/ssh/ssh_config の末尾に環境変数名を指定します。
SendEnv sftp_type
ステップ4: AKARI のインストールと初期化
AKARI をインストールしてから、以下のコマンドを実行して初期設定を行ってください。
# /usr/lib/ccs/init_policy --module_name=akari
その後、 AKARI カーネルで再起動する前に以下の操作を行ってください。
/bin/sftp-shell が実行された場合にはドメイン遷移が初期化されるようにするために、 /etc/ccs/exception_policy.conf に以下の内容を追加します。
initialize_domain /bin/sftp-shell from any
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 file read @SFTP_FILES <kernel> /bin/sftp-shell /bin/rw-sftp /usr/libexec/openssh/sftp-server file read @SFTP_FILES file write @SFTP_FILES file create @SFTP_FILES 0644 file unlink @SFTP_FILES file mkdir @SFTP_DIRS 0755 file rmdir @SFTP_DIRS file rename @SFTP_FILES @SFTP_FILES file rename @SFTP_DIRS @SFTP_DIRS file truncate @SFTP_FILES
ステップ5:学習と運用
以上で準備は完了です。 AKARI カーネルで再起動してください。
学習モードに切り替えます。
# /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 用のドメインを作成し、片方にだけ書き込み許可を与えています。このプログラムはサンプルなので判りやすいキーワードを利用していますが、実際に使用する場合にはパスワードの代わりとなるので推測されないキーワードを利用してください。
応用
環境変数 SSH_CLIENT の内容に基づいて特定のIPアドレスやポート番号から接続してきたクライアントにはアップロードを許可し、それ以外のクライアントにはダウンロードのみ許可するという使い方もできます。