はじめに
自作PCの組み立て方 ベアメタルで構築する俺のKALI【PC組み立て編】では自作PCの組み立て及び、Kaliのインストールを行いました。
本記事はAnsibleを用いてベアメタルで構築したKali Linux(以降、Kali)の構築を自動化する方法について記載しています。Ansibleを使用して構築手順をコード化することで冪等性を担保し、構成管理を容易にします。
Ansibleについて知りたい方は以前書いたAnsibleとは何か 構成管理ツールの目的〜Ansible導入まで最速で理解するを参照。
構築作業
構築作業として必要なパッケージのインストール及び、インストールした各種ソフトウェアのセットアップを行います。
リモートデスクトップ接続を実現するためにVNCを利用したTightVNC、無料のウイルス対策ソフトウェアとしてClam AntiVirus、その他、リモートでPCを起動するためにWake-on-LAN等をインストールします。また、これら新規に導入するソフトウェアに対して設定ファイルの編集や、対話的入力などセットアップ作業を行います。
Ansibleでは上記のようなプロセスについても、Playbookを活用することでオーケストレーション可能です。
Playbookを使用してシステムの望ましい状態を定義します。
公式ドキュメントのKali In The Browser (noVNC)より、ブラウザからGUIで接続する方法も紹介されています。
準備作業
本記事では以下の資材を用意します。
同様のものをkali-linux-setupリポジトリにアップロードしています。
.
|-- README.md
|-- hosts
`-- material
|-- tightvnc
|-- playbook.yml
また、前提として管理するPC側にはAnsibleと、VNCクライアントが必要です。
VNCクライアントはREALVNCのサイトからダウンロードできます。
後述するWake-on-LAN(Wol)についても管理側PCからコマンドなどで実行するための仕組みが必要です。
本記事ではこちらのwakeonlanを使用しています。
使い方は簡単でスクリプトの引数に対象となるPCのMACアドレスを指定してコマンドを実行するだけです。
Macの場合、aliasコマンドや、Automatorなどと組み合わせて使用するのがお勧めです。
留意事項としてKaliインストール直後の状態の場合、sshサービスが起動していないため、初回のみKaliにログインしてsshサービスを起動します。
環境によってはAnsibleのコマンド実行時に以下のようなsshpassに関するメッセージが出力される場合があります。
TASK [shell] ****************************************************************************************************************************************
fatal: [192.168.x.x]: FAILED! => {"msg": "to use the 'ssh' connection type with passwords or pkcs11_provider, you must install the sshpass program"}
本記事ではMac環境となり、対応としてsshpassをインストールします。
SourceForge.netのNon-interactive ssh password authからsshpassの資材をダウンロードし、opt
ディレクトリに移動して展開します。
- sshpassの展開
$ cd /opt/
$ sudo mv /Users/hoge/Downloads/sshpass-1.08.tar.gz ./
$ sudo tar -xvf sshpass-1.08.tar.gz
$ cd sshpass-1.08
以下のコマンドを実行し、インストールします。
- sshpassのインストール
$ sudo ./configure
$ sudo make
$ sudo make install
以下のコマンドを実行し、パスが通っていることを確認します。
$ which sshpass
-> /usr/local/bin/sshpass
本記事で紹介しているsshの接続方法はパスワード認証を使用しています。実際のシステム運用では公開鍵認証を使用するなど、セキュリティを確保することが重要です。
Playbook作成
構築作業を実施するためのPlaybookを作成していきます。
以下、TASK毎の解説です。
パッケージ管理
パッケージ管理の操作はaptモジュールを使用します。
アップデートは一つのタスクにまとめることできますが、本記事ではタスクを分けています。
- Documentation:ansible.builtin.apt module – Manages apt-packages
package update (apt-get update)
apt-get update
に相当し、パッケージのリストを更新します。なお、デフォルトの場合、更新されません。
- name: package update (apt-get update)
apt:
update_cache: yes
package installation
name
の値にインストールしたいパッケージを記載することで複数のパッケージをインストールします。
VNCを使用するためにXfceとxfce4-goodiesパッケージをインストールします。これには、デスクトップ環境のいくつかの拡張機能が含まれています。
- name: package installation
apt:
name:
- ethtool
- xfce4
- xfce4-goodies
- tightvncserver
- autocutsel
- clamav
- clamav-daemon
- gobuster
package upgrade (apt-get dist-upgrade)
apt-get dist-upgrade
に相当し、パッケージのアップグレードを行います。
依存関係を考慮し、一部のパッケージは削除されます。
- name: package upgrade (apt-get dist-upgrade)
apt:
upgrade: dist
systemctlの設定
新規にインストールしたパッケージについてsystemctlモジュールを使用して各サービスの起動及び、自動起動を有効にします。
clamav-daemon.service setting
clamav-daemon
のサービスを設定します。
- name: clamav-daemon.service setting
systemd:
name: clamav-daemon.service
state: started
enabled: yes
clamav-freshclam.service setting
clamav-freshclam
のサービスを設定します。
- name: clamav-freshclam.service setting
systemd:
name: clamav-freshclam.service
state: started
enabled: yes
ssh.service setting
ssh
のサービスを設定します。
- name: ssh.service setting
systemd:
name: ssh.service
state: started
enabled: yes
ethtoolの設定
ethtoolはNetwork Interface Cards (NICs) 設定を行うためのユーティリティです。
ethtool setting (enable wol feature for driver)
ethtool
コマンドを実行し、wol
オプションの値にg
を付与してWake-on-LAN(WoL)を有効にします。magic packetの受信ができるようになるため、リモートで機器の電源管理を行うことができます。なお、-s
の値はインターフェース名によって異なります。
- name: ethtool setting (enable wol feature for driver)
changed_when: False
command: ethtool -s eth0 wol g
ethtool auto start setting ("@reboot /usr/sbin/ethtool")
OS再起動後もethtoolの設定を有効にするため、cronモジュールを使用して設定します。
@rebootは起動時に1度だけ実行される指定方法です。
- name: ethtool auto start setting ("@reboot /usr/sbin/ethtool")
ansible.builtin.cron:
name: "a job for reboot"
special_time: reboot
job: "/usr/sbin/ethtool -s eth0 wol g"
tightvncserverの設定
tightvncserverの設定を行います。
tightvncserver check (passwd)
statモジュールを使用してパスワードファイルを指定し、ファイルの存在有無についてチェックを行います。
- name: tightvncserver check (passwd)
stat: path=/home/kali/.vnc/passwd
register: result
tightvncserver start (interactive input)
対話的入力はexpectモジュールを使用して制御します。
以下の例ではwhen
でパスワードファイルが存在しない場合は設定を行うように記述しています。
パスワードはハードコーディングしているため、ご注意ください。
- name: tightvncserver start (interactive input)
become: yes
become_user: kali
expect:
command: tightvncserver :1 -geometry 1280x800 -depth 24
responses:
"Password:": "********"
"Verify:": "********"
"Would you like to enter a view-only password (y/n)?": "n"
when: not result.stat.exists
script deployment (tightvncserver)
copyモジュールを使用してansibleの管理マシンから接続先ホストの指定したディレクトリに起動スクリプトをコピーします。
以下の例では管理マシン内の/etc/ansible/material/tightvnc
を接続先ホストとなる、/etc/init.d/
にコピーする例になります。
- name: script deployment (tightvncserver)
copy:
src: /etc/ansible/material/tightvnc
dest: /etc/init.d/
owner: root
group: root
mode: 0755
script auto start setting (tightvncserver)
スクリプトの自動起動を有効にします。
Playbookを繰り返し実行した場合でもchangedで記録されるため、changed_when False
を指定しています。
- name: script auto start setting (tightvncserver)
changed_when: False
command: update-rc.d tightvnc defaults
autocutsel setting (edit file)
VNC接続時に操作するPCと、リモート接続するKali間でクリップボードの共有を行うためには別途、設定が必要です。
shellモジュールを使用して、/home/kali/.vnc/xstartup
ファイルを設定します。
- name: autocutsel setting (edit file)
changed_when: False
shell: |
cat /home/kali/.vnc/xstartup | grep 'autocutsel -fork'
if [ $? != 0 ]; then sed -i '8i autocutsel -fork' /home/kali/.vnc/xstartup;else :;fi
args:
executable: /bin/bash
rockyouの展開
Kaliインストール後、rockyou.txt
ファイルは圧縮されているため、shellモジュールを使用して展開します。
uncompress compressed rockyou files
rockyouは/usr/share/wordlists
配下に存在しています。ファイルの存在有無を確認して展開しています。
- name: uncompress compressed rockyou files
changed_when: False
shell: |
cd /usr/share/wordlists
if [ -e rockyou.txt.gz ]; then gunzip -d rockyou.txt.gz;else :;fi
clamavの設定
clamavの設定を行います。
excluded directory settings (clamav)
cronモジュールを使用してclamavの自動スキャンを設定します。
- name: clamav schedule scan setting ("0 0 * * * /usr/bin/clamdscan/clamdscan -m --fdpass /")
ansible.builtin.cron:
name: "clamav schedule scan"
minute: "0"
hour: "0"
job: /usr/bin/clamdscan -m --fdpass /
clamav schedule scan setting ("0 0 * * * /usr/bin/clamdscan/clamdscan -m --fdpass /")
shellモジュールを使用して、clamavの除外ディレクトリを設定します。
- name: excluded directory settings (clamav)
changed_when: False
shell: |
cat /etc/clamav/clamd.conf | grep 'ExcludePath'
if [ $? != 0 ]; then sed -i '$a ExcludePath /usr/lib\nExcludePath /usr/share\nExcludePath /var/lib ' /etc/clamav/clamd.conf;else :;fi
args:
executable: /bin/bash
Ansible Playbook
ansible-playbook
コマンドを実行します。
コマンド実行後、sshのパスワードを入力します。
出力例
hoge@MacBook-Pro:/etc/ansible$ ansible-playbook -i hosts -k -K playbook_kali.yml
SSH password:
BECOME password[defaults to SSH password]:
PLAY [kali linux setting] *********************************************************************************************************************************
TASK [package update (apt-get update)] ********************************************************************************************************************
[WARNING]: Platform linux on host 192.168.x.x is using the discovered Python interpreter at /usr/bin/python3.10, but future installation of another
Python interpreter could change the meaning of that path. See https://docs.ansible.com/ansible-core/2.12/reference_appendices/interpreter_discovery.html
for more information.
ok: [192.168.x.x]
TASK [package installation] *******************************************************************************************************************************
changed: [192.168.x.x]
TASK [package upgrade (apt-get dist-upgrade)] *************************************************************************************************************
changed: [192.168.x.x]
TASK [clamav-daemon.service setting] **********************************************************************************************************************
changed: [192.168.x.x]
TASK [clamav-freshclam.service setting] *******************************************************************************************************************
changed: [192.168.x.x]
TASK [ssh.service setting] ********************************************************************************************************************************
changed: [192.168.x.x]
TASK [ethtool setting (enable wol feature for driver)] ****************************************************************************************************
ok: [192.168.x.x]
TASK [ethtool auto start setting ("@reboot /usr/sbin/ethtool")] *******************************************************************************************
changed: [192.168.x.x]
TASK [tightvncserver check (passwd)] **********************************************************************************************************************
ok: [192.168.x.x]
TASK [tightvncserver start (interactive input)] ***********************************************************************************************************
changed: [192.168.x.x]
TASK [script deployment (tightvncserver)] *****************************************************************************************************************
changed: [192.168.x.x]
TASK [script auto start setting (tightvncserver)] *********************************************************************************************************
ok: [192.168.x.x]
TASK [autocutsel setting (edit file)] *********************************************************************************************************************
ok: [192.168.x.x]
TASK [uncompress compressed rockyou files] ****************************************************************************************************************
ok: [192.168.x.x]
TASK [clamav schedule scan setting ("0 0 * * * /usr/bin/clamdscan/clamdscan -m --fdpass /")] **************************************************************
changed: [192.168.x.x]
TASK [excluded directory settings (clamav)] ***************************************************************************************************************
ok: [192.168.x.x]
PLAY RECAP ************************************************************************************************************************************************
192.168.x.x : ok=16 changed=9 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
ansible-playbook
コマンド実行後、failedがないことを確認し、OS再起動を行います。
OS再起動後、PCからVNCでKaliに接続できます。
以下はVNCで接続できなかった場合のキャプチャです。
OS再起動することで上記のようにログインできます。
おわりに
Ansibleを活用することで、PCが壊れた場合でも同じ環境を簡単に再現することができます。
Wolも凄い便利なユーティリティです。
わざわざ物理的に電源ボタンを押すことなく、仮想マシンのように手元からPCのシャットダウンができます。