1. はじめに
前回の「OSS ツール Part-2」では、IBM i のオープンソース環境で利用可能なテキスト処理ツールに焦点を当て、grep、sed、awkという3つの強力なツールを紹介しました。これらは、大量のテキストデータを効率的に処理する上で非常に有用です。
IBM i のネイティブ環境でも、各種ログを記録したテキストファイルを参照することは可能です。しかし、DSPFなどの5250コマンドでは基本的な分析しか行えず、本格的なログ解析はほぼ不可能です。その点、grep、sed、awkを活用することで高度な分析処理が可能になり、分析に費やす時間を大幅に短縮できる可能性があります。
これらのツールを効果的に利用するには、正規表現の理解が不可欠です。そのため、第9回の記事では、正規表現の基本的な概念についても解説しました。Linuxユーザーにはお馴染みのこれらのツールが IBM i でも利用可能であることを知ることで、IBM i 技術者の方々はログ分析、データ抽出、ファイル変換など、多岐にわたる用途で活用できることを理解していただけたのではないでしょうか。
今回は「OSS ツール Part-3」として、chrootを取り上げます。chrootはセキュリティー対策の観点から、特にファイル転送において非常に重要なツールです。近年、クラウド環境や外部サービスとのデータ連携が増加しており、転送環境のセキュリティ対策がますます求められるようになっています。
第6回で紹介したssh経由のファイル転送を振り返りながら、今回は以下のポイントを中心に解説します。
- chrootの基本的な仕組みと役割
- chrootを活用した安全なファイル転送環境の構築方法
- 実装時の注意点と管理者の負担を軽減する工夫
chrootを適切に導入することで、より堅牢で管理者が安心できる環境を構築することが可能です。
それでは始めていきましょう。
2. chrootの基本と役割
ではまず、chrootとは何かを理解しましょう。
chroot(シーエイチルート)は、LinuxやUnix系システムで利用できるコマンドで、特定のプロセスのルートディレクトリー(/)を仮想的に変更するものです。chrootを使用すると、特定のプロセスやそのプロセスが生成する子プロセスが、指定されたディレクトリー以下のみを「システム全体」として認識するようになります。

chrootにより、そのプロセスからは指定されたディレクトリー以外にアクセスできなくなります。これにより、外部からのアクセス時のセキュリティーを強化することが可能になります。
もちろん、IBM i のセキュリティー機能を使用して、不要なディレクトリーおよびストリームファイルへのアクセスを制限することでも、同様のセキュリティーを実現できます。しかし、そのためには個別の機密保護設定が必要で、設計や実装に一定のコストがかかります。また、セキュリティー上の脆弱性がないことを日々チェックする必要があります。
これに対してchrootを利用する場合は、追加のアクセス制限設定は不要です。なぜなら、ユーザー(プロセス)は、現在アクセスしているディレクトリー以外を認識することができないためです。
chrootを使えば、セキュリティーの観点から外部からの攻撃範囲を減らすことが可能になるでしょう。これは、特にssh接続や、それを使用したsftpファイル転送時に、万が一の攻撃からの被害を最小限に抑える効果があります。
また、chrootは開発およびテスト環境としても利用できます。Linuxの世界ではDockerを利用して仮想環境を実現できますが、IBM i ではDockerが実行できません。Dockerの代わりに、chrootを利用して仮想的な環境を構築することで、類似の機能を実現できます。
Dockerコンテナとの類似点と相違点
Dockerコンテナとの主な類似点は以下の通りです。
- ホストとカーネルを共有する
- レベルの違いはあるが、ホストと隔離された環境を実行できる
- 他のOSは実行できない
一方、主な相違点は以下の通りです。
- セキュリティーはコンテナの方が堅牢
- セットアップはchrootの方が簡単
- 環境の別ホストへの移行は、コンテナの方が容易
- chrootは開発やデバッグ用途が主であり、コンテナはプロダクション環境の実行にも適している
chrootを活用することで、ホスト側の環境をそのまま維持しつつ(/QOpenSys/pkgs ディレクトリを変更せずに)、OSSの新しいバージョンを試したり、古い環境を再現できます。また、異なるバージョンの開発環境やビルド環境を簡単に作成することも可能です。このように、Dockerコンテナに似た形でIFSコンテナとして利用できる点が特長です。
chrootの使用方法
chrootを使用して仮想ルートディレクトリー環境を作成する手順は、環境の作成と利用の2段階に分かれます。
手順 | 内容 | コマンド |
---|---|---|
1 | 環境作成 | chroot_setup |
2 | 仮想ディレクトリーの利用 | chroot |
chroot_setupを実行すると、以下の項目が作成されます。
- 指定した新しいルートディレクトリー
- ルートディレクトリー内に最低限必要なディレクトリー
- ルートディレクトリー内でプロセスを実行するために必要なライブラリーやバイナリ・ファイルのコピー
環境を作成した後、chrootコマンドを使用して仮想環境に入り、隔離された環境での作業を行うことが可能になります。
chrootの限界
chrootを利用すれば、隔離された環境を作成することができますが、万能ではありません。以下の点に注意が必要です。
- 完全なセキュリティー対策ではない
- 設定に手間がかかる
chrootは、ルート権限を持つユーザーが簡単にその環境に出入りできるため、完全な隔離を保証するものではありません。より強力な隔離が必要な場合は、Dockerなどの技術を検討すべきです。
また、chroot_setupコマンドにより最低限の準備は自動化されますが、それだけでは不十分な場合があります。例えば、特定のアプリケーションやライブラリーの追加が必要になる場合があります。
3. IBM i 環境での実装
それでは、IBM i 環境にて、chroot環境を順を追って作成していきましょう。以下の手順に従って進めてください。
- chrootをインストールする
- chroot_setupコマンドで、仮想ルートディレクトリーを作成する
- chrootコマンドで仮想環境に入る
- 必要なbashファイルを仮想環境にコピーする
必要なOSSのインストール
IBM i 環境でchrootを実行するには、ibmichrootが必要です。もし、ibmichrootが未インストールの場合は、yumを使用してインストールしてください。以下はインストール手順の例です。
bash-5.1$ yum install ibmichroot Setting up Install Process Resolving Dependencies --> Running transaction check ---> Package ibmichroot.noarch 0:2.1.3-1 will be installed --> Processing Dependency: /QOpenSys/pkgs/bin/python3 for package: ibmichroot-2.1.3-1.noarch --> Processing Dependency: /QOpenSys/pkgs/bin/tar for package: ibmichroot-2.1.3-1.noarch --> Processing Dependency: /QOpenSys/pkgs/bin/locate for package: ibmichroot-2.1.3-1.noarch --> Processing Dependency: unzip for package: ibmichroot-2.1.3-1.noarch --> Processing Dependency: /QOpenSys/pkgs/bin/updatedb for package: ibmichroot-2.1.3-1.noarch : update-alternatives: using /QOpenSys/pkgs/bin/python3.6 to provide /QOpenSys/pkgs/bin/python (python) in auto mode Installing : ibmichroot-2.1.3-1.noarch 6/6 Installed: ibmichroot.noarch 0:2.1.3-1 Dependency Installed: findutils.ppc64 0:4.6.0-5 libreadline8.ppc64 0:8.1-3 python3.ppc64 0:3.6.15-1 tar-gnu.ppc64 0:1.29-6 unzip.ppc64 0:6.0-4 Complete!
仮想ルートディレクトリーの作成
次に、仮想環境を作成します。仮想環境は、IBM i 環境のIFS(Integrated File System)内にある /QOpenSysディレクトリー内に作成する必要があります。IBM i 環境では、仮想環境を /QOpenSysディレクトリー外には作成できませんので注意してください。
仮想環境はディレクトリーを分けることで複数作成可能です。以下の例では、仮想環境を /QOpenSys/chroot_test ディレクトリーに作成する方法を説明します。
以下のコマンドを実行して仮想環境を作成してください。
bash-5.1$ chroot_setup /QOpenSys/chroot_test ##### # # ###### ####### ####### ####### # # # # # # # # # # # # # # # # # # # # # # ####### ###### # # # # # # # # # # # # # # # # # # # # # # # # # # ##### # # # # ####### ####### # ##### ####### ####### # # ###### # # # # # # # # # # # # # # # ##### ##### # # # ###### # # # # # # # # # # # # # ##### ####### # ##### # ********************** Live IBM i session (changes made). ********************** /QOpenSys/chroot_test /QOpenSys/chroot_test Directory already exists Would you like to continue chroot setup? [y/N]: y Would you like to create a minimal chroot w/ includes @ /QOpenSys/chroot_test? [y/N]: y ===================================== setting up based on /QOpenSys/pkgs/lib/ibmichroot/config/chroot_includes.lst ===================================== : To enter Your Chroot RUN: chroot /QOpenSys/chroot_test /QOpenSys/usr/bin/sh DONE! bash-5.1$
このコマンドにより、指定したディレクトリーが仮想環境としてセットアップされます。以下のポイントを、再度確認しておきましょう。
- chroot_setupコマンドを実行する際、対象のディレクトリーが事前に存在しない場合は自動的に作成される
- 作成した仮想環境は、独立したファイルシステム領域として機能する
セットアップが完了すると、指定したディレクトリー内に、必要なディレクトリーおよびライブラリーやバイナリ・ファイルが作成およびコピーされます。
bash-5.1$ cd /QOpenSys/chroot_test bash-5.1$ pwd /QOpenSys/chroot_test bash-5.1$ ls -l total 56 drwxr-sr-x 4 ogawa 0 8192 Jan 15 01:06 QOpenSys lrwxrwxrwx 1 ogawa 0 34 Jan 15 01:06 bin -> /QOpenSys/usr/bin drwxr-sr-x 4 ogawa 0 8192 Jan 15 01:05 dev drwxr-sr-x 2 ogawa 0 8192 Jan 15 01:05 home lrwxrwxrwx 1 ogawa 0 34 Jan 15 01:06 lib -> /QOpenSys/usr/lib lrwxrwxrwx 1 ogawa 0 36 Jan 15 01:06 sbin -> /QOpenSys/usr/sbin drwxr-sr-x 2 ogawa 0 8192 Jan 15 01:08 tmp drwxr-sr-x 2 ogawa 0 8192 Jan 15 01:06 usr lrwxrwxrwx 1 ogawa 0 26 Jan 15 01:07 var -> /QOpenSys/var bash-5.1$
では、作成した仮想ルートディレクトリー内に入ってみましょう。以下構文で入ることができます。
bash-5.1$ chroot /QOpenSys/chroot_test /QOpenSys/usr/bin/sh $
chrootコマンドの最初の引数は、chroot_setupで作成した /QOpenSys内のディレクトリー、2番目の引数は使用するシェルです。
上記コマンドを実行すると、プロンプトが $ に変わると思います。では、pwdコマンドを実行してみましょう。
$ pwd /
現在、ルートディレクトリーにいることがわかりますね。続いて ls コマンドを実行してディレクトリー構成を確認してみましょう。
$ ls -l total 112 drwxr-sr-x 4 ogawa 0 8192 Jan 15 01:06 QOpenSys lrwxrwxrwx 1 ogawa 0 34 Jan 15 01:06 bin -> /QOpenSys/usr/bin drwxr-sr-x 4 ogawa 0 8192 Jan 15 01:05 dev drwxr-sr-x 2 ogawa 0 8192 Jan 15 01:05 home lrwxrwxrwx 1 ogawa 0 34 Jan 15 01:06 lib -> /QOpenSys/usr/lib lrwxrwxrwx 1 ogawa 0 36 Jan 15 01:06 sbin -> /QOpenSys/usr/sbin drwxr-sr-x 2 ogawa 0 8192 Jan 15 01:46 tmp drwxr-sr-x 2 ogawa 0 8192 Jan 15 01:06 usr lrwxrwxrwx 1 ogawa 0 26 Jan 15 01:07 var -> /QOpenSys/var
上記ディレクトリー構成は、chroot_setupで作成された /QOpenSys/chroot_test 内と同じ(つまり、このディレクトリーを仮想ルートディレクトリーとしてプロセスが実行されている)であることがわかります。
では、仮想ルートディレクトリー環境から抜けて、ホスト環境に戻りましょう。
$ exit bash-5.1$
プロンプトが変わって元の環境に戻ってきました。現在のディレクトリーおよびルートディレクトリーの内容を確認してみましょう。
bash-5.1$ pwd /home/OGAWA bash-5.1$ ls -l / total 38683 drwxr-sr-x 3 zendphp 0 8192 Aug 2 2021 '=' -rw-rw-rw- 1 tatha 0 7 Jun 29 2023 ABC.TXT -rwxrwx--x 1 singh 0 1628 Nov 24 2021 MNU020C.css drwx---rwx 9 qdoc 0 69120 Jan 1 1970 QDLS drwx---rwx 2 qsys 0 2272 Mar 22 2024 QFileSvr.400 drwxr-sr-x 7 qsys 0 8192 Oct 27 2019 QIBM d------r-x 2 qdftown 0 1200 Mar 22 2024 QNTC drwxrwxrwx 2 qdftown 0 4096 Jan 1 1970 QOPT drwxr-sr-x 11 qsys 0 266240 Jan 15 01:04 QOpenSys :
ルートディレクトリー内は、先ほどと異なるのがお分かりいただけたと思います。
sshで直接仮想ルートディレクトリーに入る
仮想ルートディレクトリー環境に入るために、ssh接続後にchrootを実行する方法について説明しましたが、ssh接続時に特定の仮想ルートディレクトリー環境に自動で入るには、どのように設定すれば良いでしょうか。
これを実現するには、ssh接続時に使用するユーザー・プロファイルのHOMEDIRパラメーターに、接続時に直接入る仮想ディレクトリーを設定する必要があります。新しいユーザーを作成し、仮想ディレクトリーを設定するには、以下のコマンドを実行してください。
bash-5.1$ system "crtusrprf usrprf(ogawa2) password(xxxxxxx) homedir('/QOpenSys/chroot_test/./home')" CPI2221: *NONE特殊権限が認可された。 CPC2204: ユーザー・プロファイルOGAWA2が作成された。
CRTUSRPRFコマンドのHOMEDIRパラメーターの設定に注目してください。
/QOpenSys/chroot_test/./home
まず、最初に仮想ディレクトリーを絶対パスで指定します。次にドット(.)を指定していますが、この指定が重要で、ドットの左側に指定したディレクトリーをルートディレクトリーとしなさいという意味になります。さらにその後の home は、ssh で接続した直後のホームディレクトリの指定です。
では、Windowsのコマンドプロンプトから、作成した OGAWA2 ユーザーでssh接続をしてみましょう。
C:\Users\ogawa2>ssh ogawa2@172.23.0.234 ogawa2@172.23.0.234's password: $ pwd /home $ ls -l / total 112 drwxr-sr-x 4 ogawa 0 8192 Jan 15 01:06 QOpenSys lrwxrwxrwx 1 ogawa 0 34 Jan 15 01:06 bin -> /QOpenSys/usr/bin drwxr-sr-x 4 ogawa 0 8192 Jan 15 01:05 dev drwxr-sr-x 2 ogawa 0 8192 Jan 15 02:06 home lrwxrwxrwx 1 ogawa 0 34 Jan 15 01:06 lib -> /QOpenSys/usr/lib lrwxrwxrwx 1 ogawa 0 36 Jan 15 01:06 sbin -> /QOpenSys/usr/sbin drwxr-sr-x 2 ogawa 0 8192 Jan 15 01:46 tmp drwxr-sr-x 2 ogawa 0 8192 Jan 15 01:06 usr lrwxrwxrwx 1 ogawa 0 26 Jan 15 01:07 var -> /QOpenSys/var $
指定した仮想ルートディレクトリーに入っていることが確認できましたね。
上記例では、ogawa2 ユーザーが外部からアクセスする際には、ユーザー・プロファイルのHOMEDIRに指定した値を変更しない限り、仮想ディレクトリー内のみにアクセス可能であり、その他のディレクトリーに移動することはできません。例えば、ホスト側の /www ディレクトリーに移動しようとすると、
$ cd /www /www: No such file or directory $
のように、存在しないというエラーになります。不要なディレクトリにアクセスさせないようにできることがおわかりいただけたと思います。
bashをインストールする
作成した仮想ルートディレクトリー内には、最低限必要なバイナリ・ファイルしか存在せず、bashは入っていません。実際、初期状態でssh接続した場合に使用されるシェルはbshです。
$ echo $0 -bsh
では、yumを使用して、仮想環境にbashを導入しましょう。
yumをそのまま実行すると、パッケージを /QOpenSys/pkgsディレクトリー内にインストールします。今回は、仮想ルートディレクトリー内にインストールしたいので、yumコマンドに –installroot オプションを使用して、インストール先の仮想ディレクトリーを指定する必要があります。
bash-5.1$ yum --installroot=/QOpenSys/chroot_test install bash : Running Transaction Installing : filesystem-dummy-7.3-1.noarch 1/9 Installing : pase-libs-dummy-7.3-1.fat 2/9 Installing : libgcc_s1-12.4.0-3.ppc64 3/9 Installing : libstdcplusplus6-12.4.0-3.ppc64 4/9 Installing : libiconv2-1.17-1.ppc64 5/9 Installing : coreutils-pase-dummy-7.3-1.ppc 6/9 Installing : ncurses-terminfo-6.0-9.ppc64 7/9 Installing : libncurses6-6.0-9.ppc64 8/9 Installing : bash-5.2-1.ppc64 9/9 Installed: bash.ppc64 0:5.2-1 Dependency Installed: coreutils-pase-dummy.ppc 0:7.3-1 filesystem-dummy.noarch 0:7.3-1 libgcc_s1.ppc64 0:12.4.0-3 libiconv2.ppc64 0:1.17-1 libncurses6.ppc64 0:6.0-9 libstdcplusplus6.ppc64 0:12.4.0-3 ncurses-terminfo.ppc64 0:6.0-9 pase-libs-dummy.fat 0:7.3-1 Complete!
このyumにより、/QOpenSys/chroot_test/QOpenSys/pkgs/bin内にbashがインストールされました。では、改めて、Windowsユーザーから ogawa2 でssh接続してみましょう。
C:\Users\ogawa2>ssh ogawa2@172.23.0.234 ogawa2@172.23.0.234's password: $ /QOpenSys/pkgs/bin/bash bash-5.2$
シェルを、bashに変更できましたね。
4. chrootを使用したファイル転送
chrootを使用することで、外部ユーザーがアクセスできるディレクトリーを制限することが可能であることがわかりました。IBM i のディレクトリーに外部からアクセスさせる場合、セキュリティーの設定が重要であることは当然です。不要なディレクトリーへのアクセスは、故意または偶発的であっても防止する必要があるからです。

では、実際のファイル転送を、このchroot環境を使用して実行してみましょう。
ファイル転送については、第6回「ファイル転送」で詳細を解説しました。今回は、他システムからcsvやjson形式等のテキスト・データを、chrootで限定されたディレクトリー内に転送するという想定で解説をしていきます。転送にはsftpを利用するので、お忘れの場合は上述した第6回の記事を適宜参照しながら読み進めてください。
では、仮想ディレクトリーにのみアクセスが可能なユーザーを使用して、sftp接続をしてみましょう。
C:\Users\ogawa2>sftp ogawa2@172.23.0.234 ogawa2@172.23.0.234's password: Connection closed C:\Users\ogawa2>
前章で作成した ogawa2 ユーザーは、ssh接続はできましたが、sftp接続しようとするとコネクションがクローズされてしまいました。これは何故なのでしょうか。
理由を理解するためには、sftp接続についてその仕組みを、さらに深く見ていく必要があります。
sftpは 暗号化されたssh接続を経由してファイルを転送することが可能ということは、第6回の記事で説明しました。では、実際のファイル転送そのものは、どのように行われているのでしょうか。実は、sftpでのファイル転送は sftp-serverデーモンが実行しています。このデーモンは、 /QOpenSys/QIBM/ProdData/SC1/OpenSSH/libexec/ディレクトリー内に存在し、ssh起動時にデーモンとして起動し、以降のsftp接続要求を全て処理します。
ここで、chroot環境の特性を思い出してください。chrootは、特定のディレクトリーをルートsdディレクトリーとして、それ以外のディレクトリーにはアクセス不可能な仮想環境を構築する機能でした。つまり、sftp-serverが依存するライブラリーが存在するディレクトリーには、chroot環境からはアクセスができないのです。これが、先ほどsftpが失敗した原因です。
では、どのようにすればchroot環境でsftpを実行できるのでしょうか。
- chroot環境内に、sftp-server実行に必要な全てのバイナリ・ファイルを配置する
- OpenSSHに含まれているinternal-sftpを使用する
まず、chroot環境内でsftp-serverにアクセス可能な環境を構築するという方法は「不可能ではない」と思います。ただし、設定の複雑さや、chroot環境自体のサイズ(ディレクトリーのサイズ)が大きくなるため、あまりお薦めできません。
chroot環境でsftp接続を実現するには、2番目のinternal-sftpの使用が一般的です。internal-sftpは、そもそもchroot環境下でsftp通信を行うために設計されているので、簡単に利用できるからです。
ただし、internal-sftpを利用するためには、sshd_configにその旨の記載をして、sshdを再起動する必要があります。vimを使用して、/QOpenSys/QIBM/UserData/SC1/OpenSSH/etc/sshd_configの最後に、Match User以下を追加してください。
: # override default of no subsystems Subsystem sftp /QOpenSys/QIBM/ProdData/SC1/OpenSSH/libexec/sftp-server Match User ogawa2 ForceCommand internal-sftp
上記は、ogawa2(chroot 環境へのアクセスのみ許可されている)ユーザーが、internal-sftpを使用するように指定しています。
では、sshdの再起動後に、再度、sftp接続をしてみましょう。
C:\Users\ogawa2>sftp ogawa2@172.23.0.234 ogawa2@172.23.0.234's password: Connected to 172.23.0.234. sftp>
sftpで接続できましたね。実際のファイル転送の方法については、第6回の記事を参照してください。
では、sftp接続を終了し、次にssh接続を試してみましょう。
sftp> exit C:\Users\ogawa2>ssh ogawa2@172.23.0.234 ogawa2@172.23.0.234's password: This service allows sftp connections only. Connection to 172.23.0.234 closed. C:\Users\ogawa2>
internal-sftpを使用するように設定したら、今度はssh接続ができなくなってしまいました。メッセージをみると、「このサービスは、sftp接続のみを許可しています。」と表示されています。つまり、internal-sftpを使用する設定にすると、sshは接続不可になる仕様なのです。
しかし、これはむしろ好都合です。chroot環境の目的は、外部からアクセスできるディレクトリーを制限し、不要なアクセスを防ぐことです。ssh接続を制限することで、意図しないコマンドの実行を防げるため、セキュリティーが向上します。
そして、仮想ディレクトリーとはいえ、不要なインターフェースは極力使用不可にしたほうがセキュリティーも強化できます。internal-sftpを有効にすることで、sshで接続して意図しないコマンドを実行される可能性が排除できるのですから「好都合」というわけです。
環境 | ssh | sftp |
---|---|---|
通常 | 可能 | 可能 |
chroot | 可能 | 不可 |
chroot+internal-sftp | 不可 | 可能 |
クラウドなどの外部サーバーとの連携において、IBM i 側に外部からファイルを転送させる場合は、chroot + Internal-sftpで「ファイル転送専用ユーザーを安全に設定する」ことが重要ですね。
5. セキュリティー強化のための追加設定
前章では、chroot環境にアクセスするユーザーとして、新たにユーザー・プロファイルを作成しました。そして、このユーザーの認証は、sshおよびsftpのどちらの接続もパスワード認証でした。ただ、暗号化された経路で処理されるとはいえ、パスワード認証よりも公開鍵認証の方が優れていることは第7回「クライアント認証とsyslog」で解説済です。
chroot環境は、セキュリティー重視の機能なので、ユーザー認証も公開鍵認証にするべきです。
手順については第7回で解説済ですが、ここでは、もう一度その手順を追って、chroot環境にアクセスする際のユーザー認証を公開鍵認証に変更していきます。
前提
今回は、新規にユーザー・プロファイルを作成しているので、公開鍵認証で使用する鍵ペアが無いという前提で開始します。
鍵ペアの作成
ssh-keygenを使用して鍵ペアを作成します。今回は、鍵ペアの名称を id_ed25519_ogawa2 とします。
C:\Users\ogawa2>ssh-keygen -t ed25519 Generating public/private ed25519 key pair. Enter file in which to save the key (C:\Users\ogawa2/.ssh/id_ed25519): C:\Users\ogawa2/.ssh/id_ed25519_ogawa2 Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in C:\Users\ogawa2/.ssh/id_ed25519_ogawa2 Your public key has been saved in C:\Users\ogawa2/.ssh/id_ed25519_ogawa2.pub The key fingerprint is: SHA256:qI2/6FTil5EoqkGCNpQ9gtHolTvEa4jTEGzNArNmCx0 ogawa2@DESKTOP-1ODQCSM The key's randomart image is: +--[ED25519 256]--+ |B+E . | |+O+O | |BO*oo | |Oo+=.. o | |o*o + = S | |+..o * o | |o = + | |.. . + | |. .o o. | +----[SHA256]-----+ C:\Users\ogawa2>
~/.sshディレクトリーに、鍵ペアが作成されていることを確認しておきましょう。
必要なディレクトリーの作成と権限設定
続いて、作成した公開鍵を chroot 環境にコピーします。ディレクトリーの作成や所有者の変更、権限設定等を行いますので、管理者ユーザーで ssh 接続して作業を行います。
C:\Users\ogawa2>ssh ogawa@172.23.0.234 ogawa@172.23.0.234's password: -bash-5.1$
最初に、chroot環境内のhomeディレクトリーにユーザー専用ディレクトリーと、公開鍵を保存する .sshディレクトリーを作成します。
-bash-5.1$ mkdir /QOpenSys/chroot_test/home/ogawa2 -bash-5.1$ mkdir /QOpenSys/chroot_test/home/ogawa2/.ssh
上記で作成したディレクトリーの所有者を変更します。
-bash-5.1$ chown ogawa2 /QOpenSys/chroot_test/home/ogawa2 -bash-5.1$ chown ogawa2 /QOpenSys/chroot_test/home/ogawa2/.ssh
必要なディレクトリーが作成できたので、先ほど作成した公開鍵をコピーしましょう。一旦、sshを終了し、ogawa2ユーザーでsftpにてコピーを行います。
C:\Users\ogawa2>sftp ogawa2@172.23.0.234 ogawa2@172.23.0.234's password: Connected to 172.23.0.234. sftp> put ./.ssh/id_ed25519_ogawa2.pub /home/ogawa2/.ssh/authorized_keys Uploading ./.ssh/id_ed25519_ogawa2.pub to /home/ogawa2/.ssh/authorized_keys id_ed25519_ogawa2.pub 100% 105 6.4KB/s 00:00 sftp> exit C:\Users\ogawa2>
再度、管理者権限を持つユーザーでssh接続し、各ディレクトリーおよびファイルの権限設定を行います。
C:\Users\ogawa2>ssh ogawa@172.23.0.234 ogawa@172.23.0.234's password: -bash-5.1$ chmod 755 /QOpenSys/chroot_test/home/ogawa2 -bash-5.1$ chmod 700 /QOpenSys/chroot_test/home/ogawa2/.ssh -bash-5.1$ chmod 644 /QOpenSys/chroot_test/home/ogawa2/.ssh/authorized_keys -bash-5.1$ exit logout Connection to 172.23.0.234 closed. C:\Users\ogawa2>
/QOpenSys/QIBM/UserData/SC1/OpenSSH/etc/sshd_config を修正して、ogawa2 ユーザーは公開鍵認証のみ有効に設定します。
-bash-5.1$ cd /QOpenSys/QIBM/UserData/SC1/OpenSSH/etc -bash-5.1$ vim sshd_config
: Match User ogawa2 PasswordAuthentication no PubkeyAuthentication yes ForceCommand internal-sftp :
ユーザー専用のディレクトリー(/QOpenSys/chroot_test/home/ogawa2)を作成したので、ユーザー・プロファイルのHOMEDIRパラメーターも書き換えておく必要があります。
-bash-5.1$ system "chgusrprf ogawa2 homedir('/QOpenSys/chroot_test/./home/ogawa2')"
HOMEDIRパラメーターが正しく設定されていなければ、公開鍵認証を使用したクライアント認証が失敗するので慎重に修正してください。
修正が終わったら、sshdサーバーを再起動しましょう(5250にサインオン後、以下コマンドを実行する)。
ENDTCPSVR *SSHD (しばらく時間をあけて) STRTCPSVR *SSHD
では、改めて、公開鍵認証を使用してsftp接続してみましょう。
C:\Users\ogawa2>sftp -i ./.ssh/id_ed25519_ogawa2 ogawa2@172.23.0.234 Connected to 172.23.0.234. sftp>
パスワードの要求がなく、接続できることを確認してください。もし接続できない場合は、
- /QOpenSys/chroot_test/home 以下のユーザー関連ディレクトリーおよびファイル名の確認
- 上記ディレクトリーおよびファイルの所有者の確認
- 上記ディレクトリーおよびファイルの権限の確認
- sftp接続するユーザー・プロファイルのHOMEDIRパラメーターの設定値の確認
- /QOpenSys/QIBM/UserData/SC1/OpenSSH/etc/sshd_config の変更箇所の確認
を行い、ミスがあれば修正してください。
念の為、ssh接続は失敗することも確認しておきましょう。
C:\Users\ogawa2>ssh -i ./.ssh/id_ed25519_ogawa2 ogawa2@172.23.0.234 This service allows sftp connections only. Connection to 172.23.0.234 closed. C:\Users\ogawa2>
6. おわりに
今回は、外部から IBM i にsftpでファイル転送を行う際に必要なセキュリティー設定として、chrootと公開鍵認証を使用する方法を取り上げました。chrootを利用することで、外部からアクセスできるユーザーが参照可能なIFSのディレクトリーを制限でき、本来参照すべきではない他のディレクトリーへのアクセスを効果的に防止できる点をご理解いただけたと思います。
記事内では触れませんでしたが、WinSCPなどのツールを利用した場合でも、chroot設定は問題なく機能します。これらのツールを外部アクセスで使用するケースは少ないかもしれませんが、社内ユーザーに対して IFSディレクトリーを公開する場合には便利なインターフェースの候補となるでしょう。
また、chroot環境の外部からyumを使用してbashを導入する方法も解説しましたが、もちろん、bash以外の他のパッケージも同様にインストール可能です。例えば、バージョンの異なるPython環境を個別に作成したり、ユーザー単位で開発環境を構築したりすることも可能です。chrootの仕組みを正しく理解し、IBM i をより有効に活用していきましょう。
次回は、シェルスクリプトの活用方法について解説する予定です。お楽しみに!
参考文献
