Amazon Inspector 入門
Amazon Inspectorって?
自動化されたセキュリティ評価サービス。 Amazon EC2 インスタンスのネットワークアクセスと、そのインスタンスで実行しているアプリケーションのセキュリティ状態をテストできる。
Amazon Inspector を使用すると、どのようなことができるのですか?
開発およびデプロイパイプライン全体で、または静的な本番システムに対してセキュリティ上の脆弱性の評価を自動化することができます。これにより、セキュリティテストを開発および IT オペレーションの通常の一部にすることができます。
評価結果はリストが作成される。 Amazon InspectorコンソールやAPIを介して詳細な評価レポートを入手できる。
Amazon Inspector の利点
- 自動セキュリティチェックを通常のデプロイおよび本番プロセスに統合
フォレンジック、トラブルシューティング、またはアクティブな監査目的のために AWS リソースのセキュリティを評価します。
- アプリケーションのセキュリティ問題を発見
アプリケーションのセキュリティ評価を自動化し、脆弱性を予防的に特定しますこれにより、新しいアプリケーションの開発と反復実行を迅速に行い、ベストプラクティスやポリシーへのコンプライアンス状況を評価できます。
- AWS リソースのより深い理解
mazon Inspector が生み出す調査結果を確認して、AWS リソースのアクティビティおよび設定データについて常に情報を入手できる。
Amazon Inspector の評価
事前に定義されたルールパッケージを使用でき、こうしたルールパッケージは一般的なセキュリティのベストプラクティスと脆弱性の定義にマッピングされています。
Amazon Inspector の評価テンプレート
評価の実行を定義するために、ユーザーは Amazon Inspector で評価テンプレートを作成する。この評価テンプレートには、以下を割り当てる。
- 評価ターゲットを評価するためのルールパッケージ
- 評価実行時間
- 15 分
- 1 時間 (推奨)
- 8 時間
- 12 時間
- 24 時間
- 評価の実行状態と結果に関する通知の送信先である Amazon SNS トピック
- 評価の実行によって生成された結果を割り当てることができる Amazon Inspector 固有の属性 (キー/値のペア)
ルールパッケージとは何ですか?
ルールパッケージは、評価テンプレートと評価の実行の一部として構成されるセキュリティチェックのコレクションです。Amazon Inspector のルールパッケージには、Amazon EC2 インスタンスについてネットワークのアクセス可能性をチェックするネットワークの到達可能性ルールパッケージと、Amazon EC2 インスタンスの脆弱性と問題のある設定をチェックするホスト評価のルールパッケージの 2 種類があります
Amazon Inspector の評価の実行とは?
評価の実行は、指定したルールパッケージを使用して評価ターゲットの構成、インストールされたソフトウェア、動作を分析し、潜在的なセキュリティ上の問題を発見するプロセスです。
Amazon Inspector の評価実行中にパフォーマンスへの影響はありますか?
ネットワークの到達可能性のルールパッケージを使用してエージェントレス型の評価を実行する場合、アプリケーションのパフォーマンスに対する影響はありません。Amazon Inspector エージェントを使用すると、評価実行時のデータ収集フェーズにおけるパフォーマンスへの影響を最小限に抑えることができます。
評価ターゲットとは?
評価対象となる Amazon EC2 インスタンスの集合。 すべてのインスタンスを評価ターゲットに含めることも、Amazon EC2 タグを使用して一部のインスタンスを指定することもできます。
評価の実行中に検出された潜在的なセキュリティ上の問題を所見と呼ぶ。 所見は Amazon Inspector コンソールに表示されるか、API を介して検索、およびセキュリティの問題の詳細な説明およびそれを修正する方法についての推奨事項の両方を含んでいます。
脆弱性の分析対象となるソフトウェア
OSのパッケージマネージャーでインストールされたソフトウェアの脆弱性を評価する。
評価について
評価の種類 | ルールパッケージの種類 | 内容 | EC2インスタンスのエージェントの有無 |
---|---|---|---|
ネットワーク評価 | ネットワークの到達可能性 | EC2 インスタンスについてネットワークのアクセス可能性をチェックする | 不要 (有ればより詳細な評価レポートを生成) |
ホスト評価 | 共通脆弱性識別子、Center for Internet Security (CIS) ベンチマーク、Amazon Inspector のセキュリティのベストプラクティス、実行時の動作の分析 | EC2 インスタンスの脆弱性と問題のある設定をチェックする | 必要 |
- NAT を使用しているインスタンスの評価もサポートしており、ユーザーの設定は必要ない。
- プロキシ環境はLinuxならHTTPSプロキシを、WindowsならWinHTTPプロキシがサポートされている。
エージェントの導入方法
- マニュアルでインストール
- AWS Systems Manager Run Command ドキュメント (AmazonInspector-ManageAWSAgent) を用いて一回きりのロード
- EC2 User Data Function を用いて自動エージェントインストール
- AWS Lambda を用いてエージェントの自動インストール
- EC2 コンソールまたは AWS Marketplace から予めインストールされた Amazon Inspector エージェントと共にAmazon Linux AMI を用いて EC2 インスタンスを起動
制限
リソース | デフォルトの制限 |
---|---|
評価ターゲット | 50 |
実行しているエージェント | 500 |
評価点プレートの数 | 500 |
評価の実行の作成数 | 50,000 |
fluentd を使って S3 にログを集約する
環境
ソフトウェア | バージョン |
---|---|
Ubuntu | 16.04 |
td-agent | 1.2.6 |
Apache | 2.4 |
期待値
apache のアクセスログを s3 のバケット内に保管する。
設定方法
1. Fluentd をインストール
インストールスクリプトが公開されているため実行してインストールする。 URLにOSのバージョンが含まれているため、インストール対象のOSバージョンに合ったURLを確認すること。
Ubuntu のバージョン確認
$ cat /etc/os-release NAME="Ubuntu" VERSION="16.04.5 LTS (Xenial Xerus)" ID=ubuntu ID_LIKE=debian PRETTY_NAME="Ubuntu 16.04.5 LTS" VERSION_ID="16.04" HOME_URL="http://www.ubuntu.com/" SUPPORT_URL="http://help.ubuntu.com/" BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/" VERSION_CODENAME=xenial UBUNTU_CODENAME=xenial $
インストール実行。
curl -L https://toolbelt.treasuredata.com/sh/install-ubuntu-xenial-td-agent3.sh | sh
td-agent
がインストールされる。fluentd
ではない。
$ which td-agent
/usr/sbin/td-agent
$
$ td-agent --version
td-agent 1.2.6
$
2. Fluentdの設定
/etc/td-agent/td-agent.conf
を編集する。
対象となるログについて指定するsource
とログの出力設定を指定するmatch
を設定する。
apache2 のログを転送対象にする。
<source> @type tail path /var/log/apache2/access.log tag td.apache2.access pos_file /var/log/td-agent/apache2.access.log.pos format apache2 </source>
続けてログをS3へ転送する設定も追記する。
<match td.apache2.access> @type s3 s3_bucket logi-fluentd s3_region ap-northeast-1 time_slice_format %Y%m%d%H%M </match>
今回使用しないmatch
をコメントアウトする。(残したままにしているとエラーになったため)
#<match td.*.*> # @type tdlog # @id output_td # apikey YOUR_API_KEY # # auto_create_table # <buffer> # @type file # path /var/log/td-agent/buffer/td # </buffer> # # <secondary> # @type file # path /var/log/td-agent/failed_records # </secondary> #</match
ログに対するアクセス権限でエラーにならないようにする。
/etc/init.d/td-agent
を編集し、以下の箇所をroot
に変更する。
TD_AGENT_USER=root TD_AGENT_GROUP=root
EC2にS3に対する書き込み
を許可するIAMを設定する。
今回は検証なのでAmazonS3FullAccess
のポリシーで設定。
fluentd のプロセスを再起動する。
$ sudo /etc/init.d/td-agent restart
apache にアクセスしてしばらく待つと、S3 に ログが保管されていることを確認できた。
docker + nginx + uwsgi + flask の構築
環境
software | version |
---|---|
Ubuntu | 18.04 |
Docker | 18.09.0 |
docker-compose | 1.23.2 |
ディレクトリ構成
┣ myServer ┣ app ┣ Dockerfile ┣ main.py ┣ requirements.txt ┣ uwsgi.ini ┣ docker-compose.yaml ┣ nginx ┣ Dockerfile ┣ nginx.conf
1. docker-compose.yamlの作成
version: "3" services: uwsgi: # ビルドするDockerfileのでディレクトリ相対パス build: ./app # 指定したパスをコンテナにマウントする。"ホストのパス:コンテナのパス"となる volumes: - ./app:/var/www/ # 解放するポートを指定。"ホスト:コンテナ"のマッピング となる ports: - "3031:3031" # コンテナ内の環境変数を指定する environment: TZ: "Asia/Tokyo" nginx: build: ./nginx volumes: - ./nginx/nginx.conf:/etc/nginx/nginx.conf # nginxのログをホストOSの /tmp/nginx_log に出力する - /tmp/nginx_log:/var/log/nginx links: - uwsgi ports: - "4231:80" environment: TZ: "Asia/Tokyo"
2. app の設定
Dockerfile
# ベースイメージ FROM python:3.6 RUN mkdir /var/www # workdirの指定 WORKDIR /var/www # 依存Pythonライブラリ一覧コピー COPY requirements.txt ./ # 依存Pythonライブラリインストール RUN pip install --no-cache-dir -r requirements.txt CMD ["uwsgi","--ini","/var/www/uwsgi.ini"]
--no-cache-dir
: キャッシュを無効にする-r
:requirements.txt
に記載されているパッケージを一括インストールする
main.py
from flask import Flask app = Flask(__name__) @app.route("/") def hello(): return "Hello World!" if __name__ == "__main__": app.run()
requirements.txt
Flask uwsgi
uwsgi.ini
[uwsgi] wsgi-file = main.py callable = app master = true processes = 1 socket = :3031 chmod-socket = 666 vacuum = true die-on-term = true py-autoreload = 1
wsgi-file
: Flaskアプリケーションファイルcallable
: このファイル内のFlaskアプリケーションオブジェクトの名前master
: オプションを指定すると、アプリケーションサーバーとして起動したとき、ソケットを閉じずに再起動したりできるようにします。processes
: uWSGIの最大ワーカープロセス数socket
: WEBサーバとWEBアプリケーションをつなぐポートもしくはUNIXソケットファイルを指定するchmod-socket
: UNIXソケットのファイルパーミッション。指定が無い場合はデフォルトで 666 になるvacuum
: プロセス終了時に生成されたすべてのファイル/ソケットを削除するdie-on-term
: Upstartでプロセスが期待通りに処理されるために設定。uWSGIはプロセスを再ロードせずに強制終了します。py-autoreload
: コードの自動リロード機能。チェックサイクルごとにモジュールツリー全体をスキャンします。
余談
filesocket (/file/path/uwsgi.sock) を使った nginx -> uWSGI の通信の確立の仕方が分からなかった。
試したこと
- server unix:///tmp/uwsgi.sock
- server uwsgi:/tmp/uwsgi.sock
参考
3. nginx の設定
Dockerfile
FROM nginx CMD ["nginx", "-g", "daemon off;", "-c", "/etc/nginx/nginx.conf"]
nginx.conf
user nginx; worker_processes 1; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; upstream uwsgi { server uwsgi:3031; } server { listen 80; charset utf-8; location / { include uwsgi_params; uwsgi_pass uwsgi; } } }
4. dockerコンテナのビルドと実行
docker-compose.yaml と Dockerfile の内容に従ってコンテナをビルドする。
$ sudo docker-compose build Building uwsgi Step 1/6 : FROM python:3.6 ---> 1ec4d11819ad Step 2/6 : RUN mkdir /var/www ---> Using cache ---> 0cba8c49bdd8 Step 3/6 : WORKDIR /var/www ---> Using cache ---> 8d210dacf801 Step 4/6 : COPY requirements.txt ./ ---> Using cache ---> 21c64fe227f5 Step 5/6 : RUN pip install --no-cache-dir -r requirements.txt ---> Using cache ---> 2836363b7b84 Step 6/6 : CMD ["uwsgi","--ini","/var/www/uwsgi.ini"] ---> Using cache ---> 1f55d63545b3 Successfully built 1f55d63545b3 Successfully tagged myserver_uwsgi:latest Building nginx Step 1/2 : FROM nginx ---> 568c4670fa80 Step 2/2 : CMD ["nginx", "-g", "daemon off;", "-c", "/etc/nginx/nginx.conf"] ---> Using cache ---> ac6b828f2312 Successfully built ac6b828f2312 Successfully tagged myserver_nginx:latest $
docker-compose.yaml のコンテナを実行する。
$ sudo docker-compose up -d Creating network "myserver_default" with the default driver Creating myserver_uwsgi_1 ... done Creating myserver_nginx_1 ... done $
-d
: バックグラウンドで実行する
実行中のdockerコンテナのプロセスを確認。
$ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 28901248f4c9 myserver_nginx "nginx -g 'daemon of…" 53 seconds ago Up 52 seconds 0.0.0.0:4231->80/tcp myserver_nginx_1 860cd0fe644e myserver_uwsgi "uwsgi --ini /var/ww…" 54 seconds ago Up 52 seconds 0.0.0.0:3031->3031/tcp myserver_uwsgi_1 $
nginx にアクセスして検証する。
表示できた。
$ cat /tmp/nginx_log/access.log xxx.xx.73.51 - - [20/Dec/2018:14:49:10 +0900] "GET / HTTP/1.1" 200 12 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 OPR/57.0.3098.91" "-" $
アクセスログもホストOSで確認することができた。
ubuntu で Ansible を使う
1. 構成
server ---> client
役割 | IP | OS | ホスト名 |
---|---|---|---|
server | 10.0.0.204 | ubuntu 18.04 | develop01 |
client | 10.0.1.217 | ubuntu 16.04 | develop02 |
2. Ansibleの導入
インストール
ubuntu@develop01:~$ sudo apt-get update ubuntu@develop01:~$ sudo apt-get install software-properties-common ubuntu@develop01:~$ sudo apt-add-repository --yes --update ppa:ansible/ansible ubuntu@develop01:~$ sudo apt-get install ansible
バージョン確認
$ ansible --version
ansible 2.7.5 config file = /etc/ansible/ansible.cfg configured module search path = [u'/home/ubuntu/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules'] ansible python module location = /usr/lib/python2.7/dist-packages/ansible executable location = /usr/bin/ansible python version = 2.7.15rc1 (default, Nov 12 2018, 14:31:15) [GCC 7.3.0]
3. 秘密鍵、公開鍵の作成
ubuntu@develop01:~$ mkdir .ssh ubuntu@develop01:~$ cd .ssh ubuntu@develop01:~/.ssh$ ssh-keygen -t rsa -b 4096 -C "your-email@example.com" Generating public/private rsa key pair. Enter file in which to save the key (/home/ubuntu/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/ubuntu/.ssh/id_rsa. Your public key has been saved in /home/ubuntu/.ssh/id_rsa.pub. The key fingerprint is: SHA256:fMv/Wvlb/igct568ePTx4HeyMkANomdxEvA3xqqCQ7Q your-email@example.com The key's randomart image is: +---[RSA 4096]----+ | .... | | .+.o | | . ..==o | | . . ..o+... | | E oS.. | | . . . o... +o | | o . . oo =o++| | . . .=+==*| | +OO*B| +----[SHA256]-----+ ubuntu@develop01:~/.ssh$
作成した秘密鍵、公開鍵を確認。
ubuntu@develop01:~/.ssh$ ll 合計 16 drwxrwxr-x 2 ubuntu ubuntu 4096 12月 14 15:19 ./ drwxr-xr-x 3 ubuntu ubuntu 4096 12月 14 15:18 ../ -rw------- 1 ubuntu ubuntu 3326 12月 14 15:19 id_rsa -rw-r--r-- 1 ubuntu ubuntu 748 12月 14 15:19 id_rsa.pub ubuntu@develop01:~/.ssh$
ansible の playbook を実行するとデフォルトでrootに対してSSHを行う。 今回はrootに対するSSH接続を許可する。
server で作成した公開鍵を client の~/.ssh/authorized_keys
に追記。
/etc/ssh/sshd_config
に以下を設定。
PermitRootLogin prohibit-password
playbookの実行を許可するホストの管理を行う。
/etc/ansible/hosts
の末尾に接続先の情報を追記。
# This is the default ansible 'hosts' file. # # It should live in /etc/ansible/hosts # # - Comments begin with the '#' character # - Blank lines are ignored # - Groups of hosts are delimited by [header] elements # - You can enter hostnames or ip addresses # - A hostname/ip can be a member of multiple groups # Ex 1: Ungrouped hosts, specify before any group headers. ## green.example.com ## blue.example.com ## 192.168.100.1 ## 192.168.100.10 # Ex 2: A collection of hosts belonging to the 'webservers' group ## [webservers] ## alpha.example.org ## beta.example.org ## 192.168.1.100 ## 192.168.1.110 # If you have multiple hosts following a pattern you can specify # them like this: ## www[001:006].example.com # Ex 3: A collection of database servers in the 'dbservers' group ## [dbservers] ## ## db01.intranet.mydomain.net ## db02.intranet.mydomain.net ## 10.25.1.56 ## 10.25.1.57 # Here's another example of host ranges, this time there are no # leading 0s: ## db-[99:101]-node.example.com [client] 10.0.1.217
Ansibleで client のタイムゾーンと言語設定を変更する。 以下のファイルを用意。
/etc/ansible/common.yml
--- - hosts: all become: yes roles: - system - lang
/etc/ansible/roles/lang/tasks/main.yml
name: install language-pack-ja apt: name: language-pack-ja update_cache: yes - name: create locale ja_JP.UTF-8 locale_gen: name: ja_JP.UTF-8 - name: change locale command: update-locale LANG=ja_JP.UTF-8
/etc/ansible/roles/system/tasks/main.yml
- name: set timezone to Asia/Tokyo timezone: name: Asia/Tokyo
まずは--check
を付与しドライランする。
ubuntu@develop01:/etc/ansible$ ansible-playbook -i hosts common.yml --check PLAY [all] ************************************************************************************************* TASK [Gathering Facts] ************************************************************************************* Enter passphrase for key '/home/ubuntu/.ssh/id_rsa': ok: [10.0.1.217] TASK [system : set timezone to Asia/Tokyo] ***************************************************************** changed: [10.0.1.217] TASK [lang : install language-pack-ja] ********************************************************************* changed: [10.0.1.217] TASK [lang : create locale ja_JP.UTF-8] ******************************************************************** changed: [10.0.1.217] TASK [lang : change locale] ******************************************************************************** skipping: [10.0.1.217] PLAY RECAP ************************************************************************************************* 10.0.1.217 : ok=4 changed=3 unreachable=0 failed=0 ubuntu@develop01:/etc/ansible$
-i
: ホストリストのパスを指定(デフォルトは /etc/anonymous/hosts)--check
: ドライラン実行
client の状態
root@develop02:~/.ssh# loclae No command 'loclae' found, did you mean: Command 'locale' from package 'libc-bin' (main) loclae: command not found root@develop02:~/.ssh# locale LANG=en_US.UTF-8 LANGUAGE= LC_CTYPE="en_US.UTF-8" LC_NUMERIC="en_US.UTF-8" LC_TIME="en_US.UTF-8" LC_COLLATE="en_US.UTF-8" LC_MONETARY="en_US.UTF-8" LC_MESSAGES="en_US.UTF-8" LC_PAPER="en_US.UTF-8" LC_NAME="en_US.UTF-8" LC_ADDRESS="en_US.UTF-8" LC_TELEPHONE="en_US.UTF-8" LC_MEASUREMENT="en_US.UTF-8" LC_IDENTIFICATION="en_US.UTF-8" LC_ALL= root@develop02:~/.ssh# root@develop02:~/.ssh# root@develop02:~/.ssh# echo $TIMEZONE root@develop02:~/.ssh# root@develop02:~/.ssh# root@develop02:~/.ssh# timedatectl Local time: Mon 2018-12-17 05:03:53 UTC Universal time: Mon 2018-12-17 05:03:53 UTC RTC time: Mon 2018-12-17 05:03:53 Time zone: Etc/UTC (UTC, +0000) Network time on: yes NTP synchronized: yes RTC in local TZ: no root@develop02:~/.ssh#
変更実行
$ ansible-playbook -i hosts common.yml
再ログイン後に設定確認
ubuntu@develop01:~$ locale LANG=ja_JP.utf8 LANGUAGE= LC_CTYPE="ja_JP.utf8" LC_NUMERIC="ja_JP.utf8" LC_TIME="ja_JP.utf8" LC_COLLATE="ja_JP.utf8" LC_MONETARY="ja_JP.utf8" LC_MESSAGES="ja_JP.utf8" LC_PAPER="ja_JP.utf8" LC_NAME="ja_JP.utf8" LC_ADDRESS="ja_JP.utf8" LC_TELEPHONE="ja_JP.utf8" LC_MEASUREMENT="ja_JP.utf8" LC_IDENTIFICATION="ja_JP.utf8" LC_ALL= ubuntu@develop01:~$ ubuntu@develop01:~$ timedatactl Local time: Mon 2018-12-17 14:06:21 JST Universal time: Mon 2018-12-17 05:06:21 UTC RTC time: Mon 2018-12-17 05:06:21 Time zone: Asia/Tokyo (JST, +0900) Network time on: yes NTP synchronized: yes RTC in local TZ: no ubuntu@develop01:~$
変更の反映を確認。
ユーザansible
を作成してplaybook commandを実行するといくつかエラーが出たので、対処と併せて記録。
"module_stdout": "sudo: unable to resolve host"
接続先サーバの /etc/hosts
にホスト名を設定。
"module_stdout": "sudo: a password is required\r\n"
username
と ansible_sudo_pass
を指定する
$ ansible-playbook -i hosts common.yml --user=username --extra-vars "ansible_sudo_pass=yourpassword" --check
ヤマハRTX830 の設定
既存のルータをヤマハRTX830と置き換えることにした。
設定はWeb GUIとコマンドで行う方法がある。 Web GUIでは設定できないパラメータ(DHCPの割当予約)があるためコマンドによる設定を行う。
1. telnetで接続
Teratarmを使用。192.168.100.1にtelnet接続する。
RTX830 Rev.15.02.01 (Thu Jun 22 16:17:56 2017) Copyright (c) 1994-2017 Yamaha Corporation. All Rights Reserved. To display the software copyright statement, use 'show copyright' command. AA:BB:CC:DD:EE:FF, AA:BB:CC:DD:EE:FF Memory 256Mbytes, 2LAN >
2. ユーザー変更
以下のコマンドを実行し、管理ユーザにスイッチする。
administrator
> > adadministrator Password: #
3. LANポート1のIPアドレス変更
既存のルータとRTX830を置き換えるにあたってデフォルトゲートウェイのアドレスを合わせたいため、以下のコマンドを実行しルータのIPアドレスを変更する。
ip lan1 address 192.168.10.1/24
> > ip lan1 address 192.168.10.1/24
実行するとルータのIPアドレスが変更され、telnet通信が切断される。 前回のセッションがタイムアウトするまでしばらく時間を置いてから192.168.10.1に再度telnetする。
4. DHCPの設定
DHCPの割当範囲を100から開始させて、予約 & 空きはいつでも使える状態にしておきたかったが、設定がよくわからなかった。
今回は以下のように設定した。
範囲 | 用途 |
---|---|
192.168.10.1-192.168.10.99 | 予約 & 空き |
192.168.10.100-192.168.10.199 | クライアント割り当て |
administratorでログインした状態で以下を実行する。
dhcp service server dhcp server rfc2131 compliant except remain-silent dhcp scope 1 192.168.10.1-192.168.10.199/24 except 192.168.10.8-192.168.10.99 dhcp scope lease type 1 bind-priority dhcp scope bind 1 192.168.10.2 ethernet AA:BB:CC:DD:EE:FF dhcp scope bind 1 192.168.10.3 ethernet AA:BB:CC:DD:EE:FF
設定を保存する。
save
余談
公式サイトの手順に沿ってbind-only
を設定したらDHCPでアドレスが割り当てできなくて少し考えた。
参考 : DHCP認証機能