LoginSignup
6
3

More than 3 years have passed since last update.

Oracle Autonomous Linuxをハックする Part 3

Last updated at Posted at 2019-10-04

前回の続き

前回から続いた内容なので、連続した段落番号をつけている。

6. Oracle Autonomous Linux固有のal-configを調べる

これまでの調査で大まかなことが分かったので、Oracle Autonomous Linux固有のal-configを調べてみよう。

6-1. al-configパッケージの調査

al-configに含まれるファイルを調べる。

# rpm -qf `which al-config`
al-config-1.0-1.0.28.el7.noarch

# rpm -ql al-config
/etc/al-config/al.conf
/etc/al-config/yum-cron.conf
/etc/logrotate.d/al-config
/etc/profile.d/al.sh
/etc/rsyslog.d/al-exploit-alert.conf
/etc/yum.repos.d/al-al7.repo
/usr/lib/al-config
/usr/lib/al-config/activate_known_exploit_detection.sh
/usr/lib/al-config/add_cron_job.sh
/usr/lib/al-config/functions
/usr/lib/al-config/ksplice_access_key
/usr/lib/al-config/pre_config.sh
/usr/lib/systemd/system-preset/84-al.preset
/usr/lib/systemd/system/al-config.service
/usr/sbin/al-config
/usr/sbin/al-exploit-alert
/usr/sbin/al-notify
/usr/sbin/al-start
/usr/sbin/al-update
/usr/share/licenses/al-config-1.0
/usr/share/licenses/al-config-1.0/LICENSE
/usr/share/selinux/packages/omprog_exploit_detection.pp
/var/lib/al-config

上記から推測できることは以下のとおり。

  1. RPMパッケージ名のサフィックスがnoarchなので、スクリプトやテキストファイルなど非実行形式ファイル
  2. 次の2つは設定ファイル

  /etc/al-config/al.conf
  /etc/al-config/yum-cron.conf

3.al-configサービスのユニットファイル

  /usr/lib/systemd/system/al-config.service

4.logrotateの定義があるので、ログファイルを出力している

  /etc/logrotate.d/al-config

5.コマンド類
  /usr/sbin/al-*

6.Kspliceのエクスプロイト検出に対応したSELinuxポリシーモジュール

  /usr/share/selinux/packages/omprog_exploit_detection.pp

6-2. al-configの更新履歴

al-configがOracle Autonomous Linuxのコアコンポーネントであることがわかった。毎回ソース解析は面倒なので、手早く更新履歴を知るにはrpm -q --changelogが便利だ。これを見れば大まかな機能変更がわかる。

$  rpm -q --changelog al-config |head -n 15
* Wed Oct 16 2019 Frank Deng <frank.deng@oracle.com> - 1.0-1.0.30.el7
- Update AL only ksplice access key [Orabug: 30420716] (Frank Deng)  [Orabug: 30420716]
- Display ksplice first in summary (Frank Deng)

* Tue Sep 24 2019 Frank Deng <frank.deng@oracle.com> - 1.0-1.0.29.el7
- Fixes for ACL-67 - Send notification once topic OCID is configured. - Do not
  report 'needs-restaring' status be default. - Print welcome message for opc
  user login. - Fix exploit alert message. (Frank Deng)

* Fri Sep 13 2019 Frank Deng <frank.deng@oracle.com> - 1.0-1.0.28.el7
- Add license url (Frank Deng)
- Add disclaimer (Frank Deng)

6-3. al-configのライセンス

al-configのライセンスを調べると「UPL」。

$ rpm -qi al-config
Name        : al-config
Version     : 1.0
Release     : 1.0.30.el7
Architecture: noarch
Install Date: Sat 19 Oct 2019 03:46:13 PM JST
Group       : Development/Tools
Size        : 36822
License     : UPL ★

聞き慣れないので調べてみると、こちら「The Universal Permissive License (UPL)」に条文を発見。どうやらApache系のライセンスでOSSライセンスの一つ。Commercialじゃなくてよかった。

6-4. al-config.serviceサービス

al-config.serviceサービスでは/usr/sbin/al-startを起動している。

/usr/lib/systemd/system/al-config.serviceの一部
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/sbin/al-start

この中で注目は★の2箇所。それぞれについてコードを見てみよう。

/usr/sbin/al-startの一部
# pre config
/usr/lib/al-config/pre_config.sh ★

# activate know exploit detection
/usr/lib/al-config/activate_known_exploit_detection.sh

# add cron job if the cron job doesn't exit
/usr/lib/al-config/add_cron_job.sh ★

pre_config.shでは、yum-cronの自動起動やkspliceのcronジョブを無効化している。

/usr/lib/al-config/pre_config.shの一部
# Stop and disable yum-cron systemd service, then yum-cron con jobs won't actually run
systemctl stop yum-cron.service &>/dev/null
# yum-cron is pre set to disable by default
systemctl preset yum-cron.service &>/dev/null

# Disable ksplice cron jobs by commenting out the cron job entries.
for cron in /etc/cron.d/uptrack /etc/cron.d/ksplice; do
    if [ -f "$cron" ]; then
        sed -i '/^[0-9]/s/^/# /g' $cron
    fi
done

add_cron_job.shでは、al-updateを実行するcronジョブを追加している。cronの起動時間は$RANDOMを利用してランダムな値を設定している。

/usr/lib/al-config/add_cron_job.sh
if [ ! -f "$al_cron_job_file" -o $force -eq 1 ]; then
    # Add AL auto update cron job
    cat > $al_cron_job_file <<CRON
# Daily cron job for AL updates
$(($RANDOM%60)) $(($RANDOM%24)) * * * root /usr/sbin/al-update &>/dev/null
CRON
    log "Created cron job file $al_cron_job_file ."
fi

rpm -q --scriptsで、al-configパッケージをインストールしたときに実行するスクリプトを確認する。pre_config.shは、こちらでも実行している。

# rpm -q --scripts al-config
%postinstallセクションの内容
postinstall scriptlet (using /bin/sh):
# install or upgrade
/usr/lib/al-config/pre_config.sh ★
/usr/sbin/semodule -i /usr/share/selinux/packages/omprog_exploit_detection.pp ★

if [ $1 -eq 1 ] ; then
        # Initial installation
        systemctl preset al-config.service >/dev/null 2>&1 || :
fi

6-5. al-configの主要コマンド

実行可能スクリプトの行数をカウントする。行数が多いal-configやal-notify、al-updateあたりが、いろいろやっていそうだ。

# ls /usr/sbin/al-* |xargs wc -l
  227 /usr/sbin/al-config
   56 /usr/sbin/al-exploit-alert
  143 /usr/sbin/al-notify
   42 /usr/sbin/al-start
  309 /usr/sbin/al-update
  777 total

それぞれの機能を説明すると以下のとおり。

スクリプト 処理内容
al-config Notificationsの設定
al-exploit-alert ksplice-known-exploit-detectionで検出した内容を/var/log/al.logに出力
al-notify Notificationsのメッセージ通知
al-start al-configの初期設定。既存のyum-cronやkspliceジョブの無効化など
al-update Kspliceによるパッチ適用とRPMパッケージのアップデート

それぞれの呼び出し関係は以下のとおり。
al-config-diagram1.png

al-updateの冒頭を見ると、このスクリプトが実行することが書かれている。メールで送られてきたレポートと一致している。

/usr/sbin/al-update
# al-update:
# - ksplice upgrade
# - yum-cron - yum upgrade
# - report exploit attemp(s) if detected
# - report ksplice show
# - report needs-restarting
# - send notification if needed

注意:
al-config-1.0-1.0.29以降ではneeds-restartingは実行されなくなった。実行するには、以下のパラメータをyesに変更する必要がある。

/etc/al-config/al.conf
report_needs_restarting=no

al-updateのコードを調べると、下記2つの原因も判明する。

  • Kspliceは「cronジョブ無効化」「自動適用しない設定」だが自動適用されている
  • yum-cronは「cronジョブあり」「適用無効化」だが自動適用されている

Kspliceはal-updateから実行しているので、既存のcronジョブや設定ファイルとは関係なく実行される。

/usr/sbin/al-updateのksplice部分
if command -v ksplice &>/dev/null; then
    echo "Running 'ksplice -y all upgrade'." | tee -a $out_file
    ksplice -y all upgrade 2>&1 | tee -a $out_file
    ret=${PIPESTATUS[0]}

else
    echo "Running 'uptrack-upgrade -y'." | tee -a $out_file
    uptrack-upgrade -y | tee -a $out_file
    ret=${PIPESTATUS[0]}
fi

続いてyum-cron。引数に設定ファイル/etc/al-config/yum-cron.confを指定している。

/usr/sbin/al-updateのyum-cron部分
echo "Running 'yum-cron' with update cmd: default." | tee -a $out_file
yum-cron $yum_cron_config_file 2>&1 | tee -a $out_file
/usr/lib/al-config/functions
config_dir=/etc/al-config ★
# AL config
config_file=$config_dir/al.conf
# OCI config: topic OCID etc.
oci_config_file=$config_dir/oci.conf
# OCI SDK/CLI config
oci_cli_config_file=$config_dir/oci_cli.conf
# OCI API private key
oci_api_key_file=$config_dir/oci_api_key.pem
# Yum-cron config
yum_cron_config_file=$config_dir/yum-cron.conf ★

設定ファイルはapply_updates = yesになっているのでyum updateが実行される。これでkspliceとyum-cronが実行できた理由が分かった。

# grep apply_update /etc/al-config/yum-cron.conf
apply_updates = yes

6-6. al-configの設定ファイル

残りの設定ファイルが/etc/al-config/oci.confだ。Notificationsで設定した値が格納されている。

/etc/al-config/oci.conf
# This file is a bourne shell snippet, and is sourced by the
# script al-notify for configuration.

# OCI notification service topic OCID
topic="ocid1.onstopic.oc1.phx.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

6-7. al-configのログファイル

ログファイルにはNotificationsで送信する内容や、Notificationsによるメールの送信情報が出力されている。メールが送信されないときは、ERRORが無いか確認してみよう。

なお、メールが送信されるのは、Kspliceパッチを適用したときやRPMパッケージアップデートが実施させたときだ。何も変更が無く、エラーも無いときはメールは送信されない。

/var/log/al.log
+------------------------------------------------------------------------+
|  Needs-restarting status                                               |
+------------------------------------------------------------------------+
Running 'needs-restarting'.
--------------------------------------------------------------------------
Running 'needs-restarting --services'.
--------------------------------------------------------------------------
Running 'needs-restarting --reboothint'.
No core libraries or services have been updated.
Reboot is probably not necessary.
2019-10-03 12:29:12,755 - al-notify[INFO]: Publishing message 'AL: Status update
 on instance autolinux7-2'
2019-10-03 12:29:12,757 - al-notify[DEBUG]: Running OCI CLI with instance princi
pal auth.
2019-10-03 12:29:14,552 - al-notify[DEBUG]: ServiceError:
{
    "code": "NotAuthorizedOrNotFound",
    "message": "Resource Id: ocid1.onstopic.oc1.ap-tokyo-1.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx not found",
    "opc-request-id": "E5FF4BC3C68F4E19A78E753963D7F3ED/6817D51C37DAA55194292EAA
47A70945/D6CCC5F93B6CCFEFA15C267966BB6091",
    "status": 404
}
2019-10-03 12:29:14,554 - al-notify[ERROR]: Failed to publish message 'AL: Statu
s update on instance autolinux' ★メールが送信できずにエラーになっている

6-8. 管理コンソール(OS Management Service)

OS Management Serviceの正式リリースで、対象はOracle Autonomous LinuxではなくOracle Linux 6 / 7 / 8であることが判明。誤解させるようなことを書かないで欲しい。>Oracle

Oracle Autonomous Linux: 毎日に自動的にアップデートを適用。DMZに配置するようなサーバーに適している。
OS Management Service: インスタンスのアップデート管理をグループ単位で実現。管理者による制御なのでパッチ適用をコントロールしたいエンタープライズ向け。

以下は初回公開時の文面。

Oracle Autonomous Linuxを紹介しているブログでは、管理コンソールに「OS Management」というリンクが追加されている。セキュリティ・アップデートのステータスを確認できるだけで無く、メニューからアップデートを実行できるようだ。

In an Industry First, Oracle Brings Autonomous Operation to Linux
al-config-console1.PNG

7. まとめ

Oracle Autonomous Linuxの特徴

  • Oracle Autonomous LinuxはOracle Linux 7をベースとしている
  • Kspliceパッチが自動適用される
  • RPMパッケージが自動アップデートされる(yum-cron)
  • Kspliceパッチを適用したときや、yum-cronでパッケージをアップデートしたとき、Notificationsサービスを利用してメールが自動送信される
  • Oracle Autonomous Linux専用に用意されたYumリポジトリは、アップデート高速化のためにパッケージ数を制限している(推測モード)

Oracle Autonomous Linux固有の機能を支える仕組み

  • Oracle Autonomous Linux固有の機能はal-configパッケージで提供している
  • Kspliceやyum-cronの実行は、既存の仕組みは利用しないでal-configのスクリプトを利用している
  • al-configパッケージに含まれるコマンドのなかで、もっとも中心的なのはal-updateである

9. 今後に向けて

ファーストバージョンということもあり、現時点で大きな魅力は感じない。だけれど今回のOracle OpenWorld 2019では「CPUコアやメモリの柔軟な変更」「ストレージ・サイズや性能の柔軟な変更」などOracle Cloud Infrastructureのロードマップが発表された。

これらの機能と組み合わせることで、よりAutonomous(自立)になっていくのだろう。今後に期待といったところか。

Red Hat社は、何年も前からRed Hat Insightsを提供していることを忘れてはならない。以前は追加オプションだったが、RHEL8以降はサブスクリプションに含まれるのだ。

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3