OpenShift上のコンテナにroot権限でコマンドを実行する方法

OpenShift上のコンテナに対して、root権限でコマンドを実行する方法について紹介します。

  • コンテナに対してコマンドを実行する方法
  • root権限でコマンド実行する方法
  • root権限でコマンド実行するユースケース

コンテナに対してコマンドを実行する方法


OpenShiftでコンテナに対してコマンドを実行する方法を紹介します。

コンテナに対してコマンドを実行するために、以下のコマンドを利用することがあります。podに接続してインタラクティブにコマンドを実行したり、ワンライナーのコマンドをコンテナで実行することができます。ただし、コンテナ実行ユーザーでの操作になりますので、実行ユーザーがrootでない場合はroot操作を行うことができません

  • oc rsh
  • oc exec

これはシステムをセキュアに保つためですが、どうしてもroot権限で操作したいことがあったりします。本記事ではその方法について紹介します。

root権限でコマンド実行する方法


root権限でコマンド実行する方法について紹介します。以下のサポート問い合わせ履歴を参考にしました。

https://access.redhat.com/solutions/4539631

1. podが実行されているノードを確認する

$ oc get pods -o wide

2. container idを確認する

$ oc describe pod [pod名] | grep -I container

3. 手順1で確認したノードにログインし、コンテナのpidを確認する

$ pstree -p $(ps aux | awk “/[container id]/ {print \$2; exit}")
conmon(1408224)-+-dockerregistry(1408236)-+-{dockerregistry}(1408282)
                |                         |-{dockerregistry}(1408283)
                |                         |-{dockerregistry}(1408284)
                |                         |-{dockerregistry}(1408285)
                |                         |-{dockerregistry}(1408286)
                |                         |-{dockerregistry}(1408287)
                |                         |-{dockerregistry}(1408288)
                |                         |-{dockerregistry}(1408289)
                |                         |-{dockerregistry}(1408318)
                |                         |-{dockerregistry}(1409115)
                |                         |-{dockerregistry}(1409558)
                |                         |-{dockerregistry}(1415043)
                |                         `-{dockerregistry}(1429776)
                `-{conmon}(1408226)

4. コンテナに接続する

$ nsenter -a -t 1408236

5. コマンドを実行する

以下のコマンドを確認すると、rootユーザーでコマンド実行していることが確認できます。

$ whoami

root権限でコマンド実行するユースケースと体験談


本記事で紹介した操作は、大体が障害時の問題切り分けで使われることを想定しています。何故ならば、コンテナのイミュータブルな性質を無視していて、根本解決になっていないからです。

先日、OpenShiftを操作していたらdocker registryが機能していないことに気づきました。突き詰めると、docker registry podの/registryのオーナーがroot:rootになっていたことが原因でした。権限不足でレジストリへのpush/pullができない状態だったのです。

/registryのオーナー権限をchmodchownで変更すれば解決するのですが、oc rshコマンドで実行しようにも、コンテナ実行ユーザー(この時のユーザーは、1000170000でした)での操作になるのでchmodchownコマンドが実行できませんでした。

本当に原因が合っているか確かめるため、かつ即時回復が求められていたため、一時的にroot権限でコマンドを実行して回復しました。このように、問題切り分けの時には有効だと思いますので是非ご活用ください。

以上です!