0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

自作PCの組み立て方 ベアメタルで構築するKali Linux【構築編】

Last updated at Posted at 2022-06-08

はじめに

自作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.netNon-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モジュールを使用します。
アップデートは一つのタスクにまとめることできますが、本記事ではタスクを分けています。

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に接続できます。

スクリーンショット 2022-05-23 0.32.45.png

以下はVNCで接続できなかった場合のキャプチャです。
OS再起動することで上記のようにログインできます。

スクリーンショット 2022-05-23 0.28.48.png

おわりに

Ansibleを活用することで、PCが壊れた場合でも同じ環境を簡単に再現することができます。

Wolも凄い便利なユーティリティです。
わざわざ物理的に電源ボタンを押すことなく、仮想マシンのように手元からPCのシャットダウンができます。

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?