Info: Version 1.8.x is available.

English Page

Last modified: $Date: 2024-03-30 11:25:00 +0000 (Sat, 30 Mar 2024) $

環境変数を用いてダウンロード専用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/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: TOMOYO Linux のインストールと初期化

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

ステップ5:学習と運用

以上で準備は完了です。 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アドレスやポート番号から接続してきたクライアントにはアップロードを許可し、それ以外のクライアントにはダウンロードのみ許可するという使い方もできます。


目次へ戻る

sflogo.php