Ubuntu Weekly Recipe

第839回Active Directoryへの統合ツールadsysを使う(4)
Ubuntu Proサブスクリプションを必要とするポリシーの紹介

前回はadsysを使ってActive Directory(以下、AD)に参加しているUbuntuマシンにグループポリシーオブジェクト(以下、GPO)を適用しました。前回の最後に触れたように、実はadsysを展開しただけではすべてのポリシーを使えません。一部のポリシーでUbuntu Proサブスクリプションが必要です。ポリシーの「ヘルプ」に"An Ubuntu Pro subscription on the client is required to apply this policy."などと書いてあるポリシーがこれに該当します。

Ubuntu Proサブスクリプションを必要とするポリシーには、⁠これぞコンピューターやユーザーの一元管理で求められていたもの」というポリシーが多くあります。今回はその一部を紹介します。

なお、現在、adsysで使える全ポリシーの一覧と各ポリシーの詳細はこちらから確認できます。

Ubuntu Proサブスクリプションの取得と適用

Ubuntu Proについて簡潔に説明すると、Ubuntuを支援しているCanonical社が提供する有償サポートサービスのことです。詳細は本連載の第820回をご覧ください。

ただし、個人利用などであればUbuntu Oneアカウントを取得することで、誰でも5台分までのサブスクリプションを無償で入手・適用できます。フル機能のadsysを試すという意味ではこの無償で入手できるサブスクリプションを使わない手はありません[1]

そこでまずは、個人向けのサブスクリプションを入手します。Buy Ubuntu Proというページを開くと、"Who will be using this subscription?"と確認されるので、"Myself"を選びます。その状態で"Register"を押すと、Ubuntu Oneアカウントのログイン画面に移ります。アカウントを持っていればログインし、持っていなければここで作成してください。

ログインしてサブスクリプション画面に遷移すると、"Free Personal Token"と表示されているはずです。その下の"Token"とあるのはUbuntuマシンにUbuntu Proサブスクリプションを適用するためのトークンです。

このTokenを登録のためのコマンドも表示されています。マシンをサブスクリプションにアタッチする際はそのコマンドをローカル管理者アカウントで実行します。

$ sudo pro attach <トークン>

コマンド実行後に"This machine is now attached to 'Ubuntu Pro - free personal subscription'"と表示されたら、そのマシンはUbuntu Proサブスクリプションにアタッチされています。

Ubuntuマシンのローカル管理者権限の設定

第837回の最後で確認したように、ドメイン管理者であるAdministratorユーザーであってもUbuntuマシンのローカル管理者権限がありませんでした。

[email protected]@Ubuntu-2404:~$ sudo id
[sudo] [email protected] のパスワード:
[email protected] は sudoers ファイルにありません。

GPOのコンピューターポリシーを使うことで、どのADユーザーにローカル管理者権限を与えるかを設定できます。

前回までの操作で対象となるUbuntuマシンはadsysTestComputerOUに所属していますので、このOUにリンクされたadsysTestComputerGPOのポリシーで設定することにします。また、ローカル管理者権限を与えるのはADのAdministratorユーザーも所属するドメイン管理者グループDomain Admins ADグループ)に所属するユーザーとします。

実際の操作は前回同様、GPOの設定はドメインコントローラー側でおこなうため、スタートメニューから「グループ ポリシーの管理」を開きます。続いてadsysTestComputerGPOを右クリックして「編集」をクリックし、⁠グループ ポリシー管理エディター」を開きます。

その後、左側のツリーペインから「コンピューターの構成⁠⁠-⁠ポリシー⁠⁠-⁠管理用テンプレート⁠⁠-⁠Ubuntu⁠⁠-⁠Client management⁠⁠-⁠Privilege Authorization」と開きます。すると右側のペインに"Client administrators"という設定項目が見えてきますので、これをダブルクリックして開きます。

図1 Privilege Authorizationまで開いたところ

デフォルトでは「状態」「未構成」となっているため、有効に切り替えます。すると「オプション」の下にある"Client administrators"のグレーアウトが解除されます。⁠ヘルプ」に記載されているとおりですがuser@domainとした場合はそのユーザーに、%group@domainとした場合はそのグループのメンバーにローカル管理者権限が与えられます。複数のユーザー・グループに権限を付与する場合は改行して、1行毎にエントリを記述します。

今回はDomain Admins ADグループに権限を与えるので%domain admins@example.comと記載しておきます。

図2 ドメイン管理者グループにローカル管理者権限を与える設定

ポリシーの設定が終わったら、Ubuntuマシンに移り、ローカル管理者権限でGPOを適用します。

$ sudo adsysctl update --all

これによって、Administratorユーザーでもsudoを使ってroot権限を使えるようになります。

[email protected]@Ubuntu-2404:~$ sudo id
[sudo] [email protected] のパスワード:
uid=0(root) gid=0(root) groups=0(root)

ちなみに、これはsudoersファイルにより実現されています。/etc/sudoers.d/99-adsys-privilege-enforcementに次のような設定が書き込まれています。

$ sudo cat /etc/sudoers.d/99-adsys-privilege-enforcement
# This file is managed by adsys.
# Do not edit this file manually.
# Any changes will be overwritten.

"%domain [email protected]"    ALL=(ALL:ALL) ALL

また、同じ「Privilege Authorization」フォルダにある"Allow local administrators"ポリシーを「無効」にすると、これまで使ってきたローカル管理者のアカウントが無効になります。こちらも/etc/sudoers.d/99-adsys-privilege-enforcementで権限が調整されます。

図3 ローカル管理者アカウントを無効にする設定
$ sudo cat /etc/sudoers.d/99-adsys-privilege-enforcement
# This file is managed by adsys.
# Do not edit this file manually.
# Any changes will be overwritten.

%admin  ALL=(ALL) !ALL
%sudo   ALL=(ALL:ALL) !ALL

"%domain [email protected]"    ALL=(ALL:ALL) ALL

"Allow local administrators"ポリシーを「無効」にする場合は、"Client administrators"の設定に不備がないかを確認してください。不備があると、最悪の場合、ローカルユーザーもADユーザーもroot権限を要する操作ができなくなります[2]

プロキシ設定

グループ ポリシー管理エディターの「コンピューターの構成⁠⁠-⁠ポリシー⁠⁠-⁠管理用テンプレート⁠⁠-⁠Ubuntu⁠⁠-⁠Client management⁠⁠-⁠System proxy configuration」からはシステム全体のプロキシ設定が可能です。

この設定を使うには、Ubuntuマシンにubuntu-proxy-managerがインストールされている必要があります。

$ sudo apt install -y ubuntu-proxy-manager

インストールが終われば、あとはポリシーを設定するだけです。今回はHTTP Proxyにprotocol://username:password@host:portの形式で設定を入れます(認証が必要ない場合はusername:password@の部分は省略できます⁠⁠。

図4 HTTP Proxy設定画面

Ubuntuマシン側でGPOを即時適用すると、指定した内容でプロキシが設定されます。

# 環境変数
$ cat /etc/environment.d/99ubuntu-proxy-manager.conf
### This file was generated by ubuntu-proxy-manager - manual changes will be overwritten
HTTP_PROXY="http://proxy.example.com:3128"
http_proxy="http://proxy.example.com:3128"
# APTの設定
$ cat /etc/apt/apt.conf.d/99ubuntu-proxy-manager
### This file was generated by ubuntu-proxy-manager - manual changes will be overwritten
Acquire::http::Proxy "http://proxy.example.com:3128";

GPOによるスクリプト実行のための準備:adwatchdのインストール

adsysではGPOで設定することで、Ubuntuマシンの起動時やUbuntuマシンにユーザーがログインするときにスクリプトを実行できます。次はこれを紹介したいのですが、その前にスクリプトを実行するなら、ドメインコントローラーにセットアップしておいたほうがいいadwatchdというツールがあります。

ここでは、このadwatchdがなぜ必要で、どういう動きをするのかを説明し、セットアップの流れを紹介します。

まず、Ubuntuマシンにてグループポリシーで実行するスクリプトは、SYSVOLフォルダ直下に<ディストリビューション名>\scriptsというパスのフォルダに配置します。よって今回の場合、パスは\\example.com\SYSVOL\example.com\Ubuntu\scriptsです。このフォルダは存在しないため、手動で作成します。後で示すようにグループポリシーを使って実行するスクリプトはこの\\example.com\SYSVOL\example.com\Ubuntu\scriptsからの相対パスで指定します。

また、\\example.com\SYSVOL\example.com\Ubuntu\GPT.iniというファイルの配置も必要です。このGPT.iniファイルに含まれる情報にはVersionがあります。その番号が上がると、⁠新しいバージョンのアセットが使えるようになったので、ダウンロードすべきである」とドメインコンピューターが認識・判断します。ちなみに、GPT.ini自体はadsysに限らず、グループポリシー一般で使用されるものです。

ところが、手動作成した\\example.com\SYSVOL\example.com\Ubuntuフォルダはドメインコントローラーの関知するところではなく、スクリプトの更新などをおこなってもGPT.iniVersionも自動では上がりません。そのため、scriptsフォルダ以下のスクリプトを追加・編集するたびにVersionの値を何らかの方法(ドメイン管理者による手動更新も含む)でインクリメントする必要があります。

この作業を自動化してくれるのがadwatchdです。adwatchdはWindowsサービスとして稼働し、指定されたフォルダを監視し、変更が加えられたらGPT.iniVersionの値をインクリメントしてくれます。adwatchdの便利さが伝わってであろうところで、実際に展開の流れに移ります。

adwatchdの入手・展開(インストール)の方法は次の2つです。

  1. Ubuntuマシンでadsys-windowsパッケージをインストールすると配置される/usr/share/adsys/windows/adwatchd.exeをドメインコントローラーの適切な場所(例:C:\Program Files\Ubuntu\adsys\に配置する。
  2. GitHubから最新のインストーラー(adwatchd_setup.exe)を入手し、ドメインコントローラーにインストールする。

今回は第836回adsys-windowsパッケージをインストールしたので、1で進めます。Ubuntuマシンから実行ファイルをコピーし、C:\Program Files\Ubuntu\adsys\adwatchd.exeというパスで実行ファイルを配置します。

adwatchdの設定を始める前にUbuntuマシン向けのアセットフォルダ\\example.com\SYSVOL\example.com\Ubuntu\を作成し、その直下にscriptフォルダを作成します。

フォルダを作成できたら、管理者権限でコマンドプロンプトcmd.exeあるいはPowerShellを開き、adwatchd.exeを配置したフォルダに移動します。今回はC:\Program Files\Ubuntu\adsys\に配置したのでここに移動します。移動したら、adwatchd.exeを実行します[3]

設定入力画面が表示されますので、情報を入れます。項目の移動には矢印キーやTabキーが使えます。

  • Config file欄は空欄にすると、デフォルトパスで設定ファイルが作成されます。特にこだわりはないので今回は空欄のままにします。
  • Directories欄はadwatchdが監視するフォルダパスを指定します。今回は先ほど作成した\\example.com\SYSVOL\example.com\Ubuntu\を指定します。
図5 adwatchd設定画面

最後に[ Install ]にフォーカスし、Enterを押します。Service adwatchd was successfully installed and is now running.と表示されたら、インストールは成功です。

ちなみに今回設定した内容は、"C:\Program Files\Ubuntu\adsys\adwatchd.yaml"に出力されています。

PS> Get-Content "C:\Program Files\Ubuntu\adsys\adwatchd.yaml"
verbose: 0
dirs:
    - \\example.com\SYSVOL\example.com\Ubuntu

今回は対話的にこの設定ファイルを作りました。通常はこの手順が推奨されている手順ですが、生成された設定ファイルを使ってadwatchdを設定することも可能です。

PS> &"C:\Program Files\Ubuntu\adsys\adwatchd.exe" service install -c "C:\Program Files\Ubuntu\adsys\adwatchd.yaml"

複数のドメインコントローラーにadwatchdをセットアップする場合には、このように設定ファイルをコピーしてデプロイするといいでしょう[4]

GPOによるスクリプト実行(ログインスクリプト)

adwatchdがデプロイできたので、スクリプトを実行するようにGPOを設定します。スクリプトもコンピューターポリシーで実行できるのですが、実例がコンピューターポリシーばかりになるので、ユーザーポリシーとして実行するようにしてみます。

ユーザーポリシーとして設定するため、ADユーザーとして作成したubuntuユーザーが所属するadsysTestUserOUにリンクされたadsysTestUserGPOを操作します。設定するポリシーは「ユーザーの構成⁠⁠-⁠ポリシー⁠⁠-⁠管理用テンプレート⁠⁠-⁠Ubuntu⁠⁠-⁠Session management⁠⁠-⁠User Scripts」にある"Logon scripts"です。

図6 User Scriptsを開いたところ

スクリプトは次の内容のものを\\example.com\SYSVOL\example.com\Ubuntu\scriptsに配置します。

$ cat hello_world.sh
#!/bin/bash

echo "I'm $(whoami)! Hello, world! $(date)" >> $HOME/login_script.log

内容はご覧のとおり、ユーザー名と日時を含むメッセージをユーザーのホームディレクトリのファイルに書き出すというものです。

このスクリプトを配置すると、adwatchdが自動でGPT.iniを生成します[5]

PS> Get-Content \\example.com\SYSVOL\example.com\Ubuntu\GPT.INI
[General]
Version=1

続いて、ポリシーを設定します。入力する値は\\example.com\SYSVOL\example.com\Ubuntu\scriptsからのスクリプトへの相対パスなのでhello_world.shです。

図7 ログインスクリプトの設定

設定が終わったらログイン画面からubuntuユーザーでログインします[6]

[email protected]@Ubuntu-2404:~$ cat login_script.log
I'm [email protected]! Hello, world! 2024年 10月 30日 水曜日 12:37:03 JST

簡単に仕組みにも触れておくと、adsys-user-scripts.serviceというsystemdのユーザーサービスによって、ログイン時にスクリプトが実行されるようになっています。

[email protected]@Ubuntu-2404:~$ systemctl --user cat adsys-user-scripts.service
# /usr/lib/systemd/user/adsys-user-scripts.service
[Unit]
Description=ADSys user logon and logoff scripts execution
Before=shutdown.target
Conflicts=shutdown.target
ConditionPathExists=/run/adsys/users/%U/scripts/.ready

[Service]
Type=notify
# needed for systemd-notify from non root user. Only open it to elements of the cgroup.
NotifyAccess=all
RemainAfterExit=yes
ExecStart=/sbin/adsysd runscripts --allow-order-missing /run/adsys/users/%U/scripts/logon
ExecStop=/sbin/adsysd runscripts --allow-order-missing /run/adsys/users/%U/scripts/logoff

[Install]
WantedBy=default.target

[email protected]@Ubuntu-2404:~$ cat /run/adsys/users/$(id -u)/scripts/logon
scripts/hello_world.sh

[email protected]@Ubuntu-2404:~$ cat /run/adsys/users/$(id -u)/scripts/scripts/hello_world.sh
#!/bin/bash

echo "I'm $(whoami)! Hello, world! $(date)" >> $HOME/login_script.log

全4回にわたりadsysについて解説しました。

個人利用のUbuntuマシンには縁遠いものですが、会社などの組織でPCを使用していく場合、程度の差こそあれ、システム管理者が組織的にPCを管理する必要が出てきます。adsys(とUbuntu Proサブスクリプション)を使ってUbuntuマシンにGPOを適用できることで、システム管理者はすでに組織に存在するWindowsマシンと近い感覚でUbuntuマシンを管理できるようになります。

正直なところ、使ってみるとまだまだ改善・強化の余地が残されているとは感じますが、adsysを使うことでADを利用している組織でUbuntuデスクトップを導入しやすくなります。今後の発展には期待・注目したいところです。

おすすめ記事

記事・ニュース一覧