X

Oracle Solaris, Oarcle ハードウェア製品に関する情報

  • Sun
    April 22, 2010

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

Guest Author
今回は、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


  • Be the first to comment

    Comments ( 0 )
    Please enter your name.Please provide a valid email address.Please enter a comment.CAPTCHA challenge response provided was incorrect. Please try again.