akarititle.png

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