TSALVIA技術メモ

CTFのWriteupや気になったツールについて書いていきます。また、このサイトはGoogle Analyticsを利用しています。

オフラインのWindows10環境にAnsibleを導入する方法

はじめに

2019年7月4日、5日に開催されたHardening II SUという大会に参加してきました。

wasforum.jp

大会の中で、オフライン環境のWindiws10にAnsibleをインストールしなければならない機会がありました。 AnsibleをWindows10環境で動作させるためには、大まかに以下の3つの手順が必要です。

  • Linux環境(WSL)の準備
  • ansibleのインストール
  • pywinrmのインストール(Windowsも制御対象の場合のみ)

オフライン環境に導入するためには、少し面倒くさい手順が必要です。 大会当日に準備できなかった人が多かったみたいだったので、導入手順を紹介します。

検証環境

事前準備

オンライン環境で事前にパッケージをダウンロードしておく必要があります。 Ansibleやpywinrmは、依存しているパッケージがたくさんあり、準備だけでもかなり面倒くさいです。

1. WSL用のDebianディストリビューションパッケージのダウンロード

  • 以下のコマンドでダウンロードする
    PS1> Invoke-WebRequest -Uri https://aka.ms/wsl-debian-gnulinux -OutFile DeianGNULinux.Appx -UseBasicParsing
    
  • もしくは、以下のリンク先にある Debian GNU/Linux からダウンロードする。 docs.microsoft.com

2. Ansibleに必要なパッケージのダウンロード

2-1. 依存パッケージをすべてダウンロードするためのスクリプトを用意する

Ubuntu 16.04: 依存パッケージを含めたdebパッケージをダウンロードする - Narrow Escape を参考にしました。

  1. apt-rdepends(依存パッケージを表示するツール)をインストールする。
    $ sudo apt-get install apt-rdepends
    
  2. 依存パッケージをすべてダウンロードするためのスクリプト(download_deb_package.sh)を用意する。
    #!/bin/sh
    
    if [ $# -ne 1 ]; then
      prog=`basename ${0}`
      echo "usage: ${prog} <package>"
      exit 1
    fi
    
    TMP=`mktemp -t a.sh.XXXXXX`
    trap "rm $TMP* 2>/dev/null" 0
    
    check_virtual_package()
    {
      apt show $1 2> /dev/null | grep "not a real package" > /dev/null
      return $?
    }
    
    get_provide_package()
    {
      apt install -s $1 > ${TMP} 2> /dev/null
    
      local state=0
      local pkgs=""
      while read line; do
        if [ "${line}x" = "Package $1 is a virtual package provided by:x" ]; then
          state=1
        elif [ ${state} -eq 1 -a -n "${line}" ]; then
          pkg=`echo ${line} | awk '{ print $1 }'`
          echo ${pkg} | grep -v ':i386' > /dev/null && pkgs="${pkg} ${pkgs}"
        fi
      done < ${TMP}
    
      echo "${pkgs}"
    }
    
    get_depend_package()
    {
      local pkgs=""
      local pkg=""
    
      for pkg in `apt-rdepends $1 2> /dev/null | grep -v "^  "`; do
        check_virtual_package ${pkg}
        if [ $? -eq 0 ]; then
          pkg=`get_provide_package ${pkg}`
        fi
        pkgs="${pkgs} ${pkg}"
      done
    
      echo "${pkgs}"
    }
    
    download_deb_package()
    {
      local pkgs=""
      pkgs=`get_depend_package $1`
      apt download ${pkgs}
    }
    
    download_deb_package $1
    
  3. 上記のスクリプトに実行権限を付与する。
    $ chmod +x ./download_deb_package
    

2-2. ansibleに必要なパッケージをダウンロードする
debパッケージ)

  • ansible(必須)
    $ mkdir ansible_deb_packages
    $ cd ansible_deb_packages
    $ sudo ../download_deb_package ansible
    
  • python-pip(AnsibleでWindowsも制御したい場合のみ)
    $ mkdir python-pip_deb_packages
    $ cd python-pip_deb_packages
    $ sudo ../download_deb_package python-pip
    
  • gcc(AnsibleでWindowsも制御したい場合のみ)
    $ mkdir gcc_deb_packages
    $ cd gcc_deb_packages
    $ sudo ../download_deb_package gcc
    
  • python2.7-dev(AnsibleでWindowsも制御したい場合のみ)
    $ mkdir python2.7-dev_deb_packages
    $ cd python2.7-dev_deb_packages
    $ sudo ../download_deb_package python2.7-dev
    
  • libffi-dev(AnsibleでWindowsも制御したい場合のみ)
    $ mkdir libffi-dev_deb_packages
    $ cd libffi-dev_deb_packages
    $ sudo ../download_deb_package libffi-dev
    
  • libssl-dev(AnsibleでWindowsも制御したい場合のみ)
    $ mkdir libssl-dev_deb_packages
    $ cd libssl-dev_deb_packages
    $ sudo ../download_deb_package libssl-dev
    

2-3. ansibleに必要なパッケージをダウンロードする
(pipパッケージ)

  • setuptools(AnsibleでWindowsも制御したい場合のみ)
    $ mkdir setuptools_pip_packages
    $ cd setuptools_pip_packages
    $ pip download -d . --no-binary :all: setuptools
    
  • wheel(AnsibleでWindowsも制御したい場合のみ)
    $ mkdir wheel_pip_packages
    $ cd wheel_pip_packages
    $ pip download -d . --no-binary :all: wheel
    
  • pywinrm(AnsibleでWindowsも制御したい場合のみ)
    $ mkdir pywinrm_pip_packages
    $ cd pywinrm_pip_packages
    $ pip download -d . --no-binary :all: pywinrm
    

導入手順

1. WSLのインストール

1-1. WSL(Windows Subsystem for Linux)を有効にする

  1. 管理者モードでPowerShellを開き、以下のコマンドを入力する。
    PS> Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
    
  2. コンピュータを再起動する。

1-2. WSL用のDebianを起動する

  1. 事前に用意したDebianディストリビューションパッケージを持ってくる。
  2. PowerShellで以下のコマンドを実行し、Debianを起動する。
    PS> Rename-Item DebianGNULinux.Appx DebianGNULinux.zip
    PS> Expand-Archive DebianGNULinux.zip
    PS> .\DebianGNULinux\debian.exe
    
  3. ユーザ名とパスワードを設定する。

2. Ansibleのインストール

  1. 事前に用意したAnsible用のdebパッケージを持ってくる。
  2. debパッケージをすべてインストールする。
    $ cd ansible_deb_packages
    $ sudo dpkg -i --force-depends *.deb
    

3. python-pipのインストール
(AnsibleでWindowsも制御したい場合のみ)

3-1. python-pipをインストールする

  1. 事前に用意したpython-pip用のdebパッケージを持ってくる。
  2. debパッケージをすべてインストールする。
    $ cd python-pip_deb_packages
    $ sudo dpkg -i --force-depends *.deb
    

3-2. setuptoolsをアップデートする

  1. 事前に用意したsetuptoolsのpipパッケージを持ってくる。
  2. setuptoolsをアップデートする。
    $ sudo pip install --upgrade setuptools-41.0.1.zip
    
    ※ ちなみにアップデートしないと、以下のようなエラーが出てしまいます。
    Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-3l_UOj-build/
    

4. winrmのインストール
(AnsibleでWindowsも制御したい場合のみ)

4-1. wheelをインストールする

  1. 事前に用意したwheelのpipパッケージを持ってくる。
  2. wheelをインストールする。
    $ pip install wheel-0.33.4.tar.gz
    

4-2. gccをインストールする

  1. 事前に用意したgccdebパッケージを持ってくる。
  2. debパッケージをすべてインストールする。
    $ cd gcc_deb_packages
    $ sudo dpkg -i --force-depends *.deb
    

4-3. python2.7-devをインストールする

  1. 事前に用意したpython2.7-devのdebパッケージを持ってくる。
  2. debパッケージをすべてインストールする。
    $ cd python2.7-dev_deb_packages
    $ sudo dpkg -i --force-depends *.deb
    

4-4. libffi-devをインストールする

  1. 事前に用意したlibffi-devのdebパッケージを持ってくる。
  2. debパッケージをすべてインストールする。
    $ cd libffi-dev_deb_packages
    $ sudo dpkg -i --force-depends *.deb
    

4-5. libssl-devをインストールする

  1. 事前に用意したlibssl-devのdebパッケージを持ってくる。
  2. debパッケージをすべてインストールする。
    $ cd libssl-dev_deb_packages
    $ sudo dpkg -i --force-depends *.deb
    

4-6. pywinrmをインストールする

  1. 事前に用意したpywinrmのpipパッケージを持ってくる。
  2. pipパッケージをすべてインストールする。
    $ cd pywinrm_pip_packages
    $ pip install --no-index --find-links . *
    

おわりに

今回は、オフラインのWindows10環境にAnsibleを導入する手順について紹介しました。 ここまでやって、やっとAnsibleを使用するためのスタートラインに立つことができます。

大会当日は、手動で導入作業していたため、Ansibleが使用できるようになるまでに約40分掛かってしまいました。 このようにオフライン環境に一から導入するには、結構時間がかかってしまいます。 Ansibleの用途にもよりますが、単純なものであれば、シンプルなシェルスクリプトなどで代用することも検討に入れたほうがいいと思います。

参考にしたサイト