Windowsサーバーコマンド連携手順
UCIDMのconsumerコンテナにはWinRM接続を行うためのPythonライブラリ pywinrm がインストールされています。 設定を行うことで、UCIDMからWindowsサーバーへコマンド連携が可能になります。 WinRMではいくつかの認証方式で接続できますが、ここではkerberos認証を使ってWindowsサーバーへ、WinRM接続する設定手順を説明します。
前提条件
設定手順を説明するにあたって、以下の条件を前提とします。
- UCIDMがインストール・設定済みであること
- WindowsサーバーにてActiveDirectoryがインストール・設定済みであること
- UCIDMインストール済みサーバーからWindowsサーバーへ通信が可能であること
- TCP/5985 (HTTP)
設定手順概要
設定手順はおおまかに以下の手順になります。 設定には接続元になるUCIDMサーバーと、接続先になるWindowsサーバーの両方で作業が必要になります。
- kerberosの設定
- pythonスクリプトの作成
- UCIDMの設定
kerberosの設定
kerberos認証を行うために、Kerberosの設定を行います。 kerberos認証には認証情報を含めたkeytabファイルを利用します。 keytabファイルの作成はWindowsサーバー側で行います。
Windowsサーバー側の設定
Windowsサーバー側での設定手順は以下の通りです。
- 接続用アカウントの作成
- keytabファイルの作成
また以下の情報が必要になるので、事前に確認してください。
- ActiveDirectoryのドメイン名 (例: EXAMPLE.COM)
- PowerShell上
Get-ADDomain | select Forestコマンドで確認出来ます
- PowerShell上
- Windowsサーバーのホスト名 (例: WIN-SERVER)
- PowerShell上
hostnameコマンドで確認出来ます
- PowerShell上
接続用アカウントの作成
winrm接続用のアカウントをActiveDirectoryに作成します。
ユーザー名とパスワードは特に制約はありません。
ここでは winrm / password とします。
作成したユーザーは Administrators グループに所属させてください。
keytabファイルの作成
keytabファイルは ktpass というコマンドで作成します。
Windowsサーバー上でPowerShellを起動し、以下のコマンドを実行してください。
ktpass -princ <プリンシパルネーム> -mapuser <接続用ユーザー名> -pass * -crypto AES256-SHA1 -out <keytabファイル名>
ここで、各パラメータは以下の通りです。
- プリンシパルネーム:
HTTP/<Windowsサーバーのホスト名>@<Active Directoryのドメイン名>という形式になります。 - 接続用ユーザー名: 先ほど作成した接続用アカウントのユーザー名
- keytabファイル名: 作成するkeytabファイルの名前を指定します。ここでは
winrm-<ドメイン名>.keytabとします。
例として、ドメイン名が EXAMPLE.COM、Windowsサーバーのホスト名が WIN-SERVER、接続用アカウントが winrm の場合、以下のようになります。
ktpass -princ HTTP/WIN-SERVER@EXAMPLE.COM -mapuser winrm -pass * -crypto AES256-SHA1 -out winrm-example.com.keytab
コマンドを実行するとパスワードの入力を求められるので、接続用アカウントのパスワードを入力してください。
コマンド実行後keytabファイルが作成されるので、UCIDMサーバーに転送します。 機密情報を含むので、慎重に取り扱ってください。
UCIDMサーバー側の設定
UCIDMサーバー側での設定手順は以下の通りです。
- kerberosの設定ファイルの作成・配置
- keytabファイルの配置
- composeファイルの編集
kerberosの設定ファイルの作成・配置
kerberosの設定ファイルを作成します。
winrmに関連するファイルをまとめるために、/opt/osstech/var/lib/ucidm/krb5/ というディレクトリを作成します。
kerberosの設定ファイルは /opt/osstech/var/lib/ucidm/krb5/winrm.conf というパスに作成します。
以下は設定ファイルの例です。
[libdefaults]
default_client_keytab_name = /etc/winrm.keytab
[realms]
EXAMPLE.COM = {
kdc = win-server.example.com
admin_server = win-server.example.com
}
[realms] セクションの値は環境に合わせて変更してください。
<ドメイン名> = {
kdc = <WindowsサーバーのFQDN>
admin_server = <WindowsサーバーのFQDN>
}
ファイル作成後パーミッションを調整します。
chmod 644 /opt/osstech/var/lib/ucidm/krb5/winrm.conf
keytabファイルの配置
前章で作成したディレクトリにkeytabファイルを配置します。
/opt/osstech/var/lib/ucidm/krb5/winrm-<ドメイン名>.keytab というパスに配置します。
配置後パーミッションを調整します。
chmod 640 /opt/osstech/var/lib/ucidm/krb5/winrm-<ドメイン名>.keytab
rootlesskit chown 1001:root /opt/osstech/var/lib/ucidm/krb5/winrm-<ドメイン名>.keytab
composeファイルの編集
composeファイルを編集して、作成したファイルをコンテナにバインドマウントします。
/opt/osstech/var/lib/ucidm/compose.yml ファイルを編集します。
winrmによるコマンド連携を行うconsumerコンテナの記述がされている箇所に、volumesの設定を追加します。
volumes:
- type: bind
source: ./krb5/winrm.conf
target: /etc/krb5.conf.d/winrm.conf
bind:
create_host_path: false
- type: bind
source: ./krb5/winrm-<ドメイン名>.keytab
target: /etc/winrm.keytab
bind:
create_host_path: false
変更を反映するにはconsumerコンテナを再生成してください。
pythonスクリプトの作成
pywinrmを使ってWindowsサーバーへコマンドを送信するサンプルスクリプトを示します。
import sys
import winrm
AD_SERVER = "win-server.example.com" # WindowsサーバーのFQDN
def main():
session = winrm.Session(AD_SERVER,
auth=(None, None),
transport="kerberos",
)
res = session.run_cmd("ipconfig")
print(res.std_out.decode("CP932"))
sys.exit(res.status_code)
if __name__ == "__main__":
main()
WindowsサーバーのFQDNとホスト名が一致していない場合は、 kerberos_hostname_override というパラメーターで別途ホスト名を指定してください。
session = winrm.Session(AD_SERVER,
auth=(None, None),
transport="kerberos",
kerberos_hostname_override="WIN-SERVER.EXAMPLE.COM" # Windowsサーバーのホスト名
)
作成したスクリプトは保存します。
保存先は外部連携名や実行タイミングに応じて変動します。
詳細は外部連携の前処理/後処理で実行するスクリプトの配置を参照してください。
ここでは例として /opt/osstech/var/lib/ucidm/server-data/destination/local-001/scripts/UserAdded/connect_ad.py というパスに保存します。
作成したスクリプトのパーミッションを調整します。
chmod 700 /opt/osstech/var/lib/ucidm/server-data/destination/local-001/scripts/UserAdded/connect_ad.py
rootlesskit chown 1001:root /opt/osstech/var/lib/ucidm/server-data/destination/local-001/scripts/UserAdded/connect_ad.py
変更を反映するにはconsumerコンテナとapiコンテナを再生成してください。
UCIDMの設定
UCIDMの管理画面から前処理/後処理で実行するスクリプトとして、今回作成したスクリプトを追加してください。
追加手順は 外部連携の前処理/後処理で実行するスクリプトの設定 を参照してください。