ローカルゾーン上での特権 sys_time の設定例

今回は、Solaris ゾーン(non-global zone)上でシステムの時刻を変更することについて考えてみます。
デフォルトではシステムの時刻設定はグローバルゾーン上で行いますが、Solaris ゾーン上で同じ事が出来るでしょうか。もしそれが出来れば、インタネット上の NTP サーバ と時刻を同期するのにグローバルゾーンを隠す一つの方法になると思います。

Solaris ゾーンでは、特権(privilege)の割り当てにより、ゾーン上で使用されるリソースを制限しています。例えば、今回の場合ではシステム時刻を変更するには、sys_time 特権が必要となります。
Solaris のシステム管理 (Solaris コンテナ : 資源管理と Solaris ゾーン)を確認すると、この sys_time 特権は Solaris ゾーン内の状態は「任意」です。これは、個別に Solaris ゾーンへ指定することが可能なことを意味します。また、sys_time 特権の内容は次のようにして確認することが可能です。
global# ppriv -lv sys_time
sys_time
        適切なシステムコール (stime、adjtime、ntp_adjtime) と x86 固有の
        RTC 呼び出しのいずれかを使用して、システム時刻を操作できるように
        します。
それでは実際に sys_time 特権を Solaris ゾーンへ割り当ててみます。
デフォルトでは sys_time 特権は Solaris ゾーンに割り当てられていませんので、時刻を変更しようとするとエラーとなります。
下記の例では、ppriv(1M) コマンドを使用して特権の不足も合わせて確認しています。ppriv(1M) コマンドがない場合は最初の一行目は出力されません。
global# ppriv -l zone | grep sys_time   <=== グローバルゾーンで指定できる特権
sys_time
zone0# ppriv -l zone | grep sys_time    <=== Solaris ゾーンで指定できる特権
zone0#                                     <=== デフォルトでは特権 sys_time なし
zone0# ppriv -D -e date 021818502010
date[29958]: missing privilege "sys_time" (euid = 0, syscall = 25) needed at stime+0x21
date: Not owner
usage:  date [-u] mmddHHMM[[cc]yy][.SS]
        date [-u] [+format]
        date -a [-]sss[.fff]
上記出力から sys_time 特権が date(1) コマンドの実行に不足していることが確認できます。
Solaris ゾーンでは、不足している特権をグローバルゾーンから zonecfg(1M) コマンドで limitpriv プロパティを指定することで追加できます。このプロパティに、sys_time 特権を指定します。
global# zoneadm -z zone0 halt
global# zonecfg -z zone0 set limitpriv="default,sys_time"
global# zonecfg -z zone0 info
zonename: zone0
zonepath: /zfs/zpool0/zone0
brand: native
autoboot: false
bootargs:
pool:
limitpriv: default,sys_time   <=== ここ
scheduling-class:
ip-type: shared
inherit-pkg-dir:
        dir: /lib
inherit-pkg-dir:
        dir: /platform
inherit-pkg-dir:
        dir: /sbin
inherit-pkg-dir:
        dir: /usr
net:
        address: 192.168.1.100
        physical: skge0
        defrouter が指定されていません

global# zoneadm list -vc
  ID NAME             STATUS     PATH                           BRAND    IP
   0 global           running    /                              native   shared
   - zone0            installed  /zfs/zpool0/zone0              native   shared
global# zoneadm -z zone0 boot
global# zoneadm list -vc
  ID NAME             STATUS     PATH                           BRAND    IP
   0 global           running    /                              native   shared
   4 zone0            running    /zfs/zpool0/zone0              native   shared
改めて Solaris ゾーン上で時刻を設定してみると、設定出来ることが確認できました。
global# zlogin zone0
[ゾーン 'zone0' pts/5 に接続されました]
Last login: Mon Apr 19 15:18:32 on pts/5
Sun Microsystems Inc.   SunOS 5.10      Generic January 2005
zone0#
zone0# ppriv -l zone | grep sys_time
sys_time
zone0# date
2010年04月19日 (月) 16時00分59秒 JST
zone0# ppriv -D -e date 04192359

2010年04月19日 (月) 23時59分00秒 JST
zone0#

global# date
2010年04月19日 (月) 23時59分05秒 JST
うまく設定が出来るようになりましたが、1 点注目すべきポイントがあります。
上記設定はシステムの時刻設定をした事になりますので、グローバルゾーンにも時刻変更の影響を与えます。試してはいませんが、同一サーバ上の他の Solaris ゾーンにも同様に影響が出ることになります。
次の例はデフォルトの動作になりますが、グローバルゾーンで時刻を設定すれば、Solaris ゾーンにも反映されます。
global#  ppriv -D -e date 04191540
2010年04月19日 (月) 15時40分00秒 JST
global# date
2010年04月19日 (月) 15時40分05秒 JST

zone0# date
2010年04月19日 (月) 15時40分03秒 JST
このように、Solaris ゾーンで必要な特権を割り当てることで時刻を設定することが可能でした。グローバルゾーンを含む他のゾーンにも時刻設定の影響が出ることも確認できました。
sys_time 特権は、date(1) コマンドの他に ntpdate(1M) コマンドや xntpd(1M) デーモンでも使用されていますので、冒頭で考えたようにグローバルゾーンをインタネットにさらけ出さずにすみそうです。
最後に、今回の設定と netservices(1M) 等とを組み合わせれば、よりセキュアな Solaris ゾーン環境を構築できることになりますね。

参考ドキュメント
  • Solaris のシステム管理 (Solaris コンテナ : 資源管理と Solaris ゾーン)
  • Solaris 10 - アプリケーションのゾーン対応
  • Shrink-Wrap Security

  • 投稿されたコメント:

    コメント
    コメントは無効になっています。
    About

    Search

    Archives
    « 4月 2014
      
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
       
           
    今日