LoginSignup
30

More than 1 year has passed since last update.

posted at

updated at

買ったらまず実施!Jetson Nanoのセットアップとセキュリティ対策

はじめに

本記事は、Jetson Nano購入時のセットアップ方法と、実施すべきセキュリティ対策について紹介します。

Jetson Nanoとセキュリティ

Jetson Nanoは、ポータブルにDeep Learning等のAI技術を活用できるデバイスで、2021年時点では代表的なIoT製品の一つと言えます。

近年このようなIoT製品を悪用したセキュリティ攻撃が多発しており、
その代表例であるマルウェア"Mirai"では、ネットに常時接続されたWebカメラの脆弱性を悪用されました。
image.png
Jetson Nanoは画像処理を主用途とする特性上、上記のWebカメラと同様に常時稼働を前提とした使用法が想定され、攻撃のターゲットになる可能性は十分に考えられます。
その一方で競合製品のRaspberry Piと比べ、セキュリティ関係の記事が非常に少ないと感じたので、対策を本記事にまとめたいと思います。

必要なもの

・Jetson Nano (本例ではJetson Nano 2GBモデルを使用)
・MicroSDカード(本例では128GBを使用)
・USBマウス&キーボード
・無線LAN子機
・PC (SSH接続の確認に使用。本例ではWindows10を使用)
・上記Jetson NanoとPCのLAN接続環境(無線LANルータにつなげばOK)

セットアップ

まずは公式手順に従い、Jetson Nanoを動作する状態までセットアップします

手順(リンク先から具体内容に飛べます)
・周辺機器の接続
・SDカードのフォーマット
・SDカードにOSインストール
・OSの初期設定

周辺機器の接続

下図に基づき、電源、HDMI、マウス、キーボード、無線LAN子機(またはLANケーブル)を接続します。
image.png

SDカードのフォーマット

こちらのサイトからSD Memory Card Formatterをダウンロードし、指示に従ってインストールします。

インストールが終わったら、SD Memory Card Formatterを起動してフォーマットを実行します。
image.png

インストール後、エクスプローラで認識されているかを確認します
image.png

SDカードにOSインストール

NVIDIA公式が配布している「JetPack」というOSをSDカードにインストールします。
JetPackはUbuntuベースのOSで、Jetson Nanoの独自機能を付加しています。

OSイメージのダウンロード

こちらのアドレスからOSイメージ(2GBモデルの場合、「Jetson Nano 2GB Developer Kit SD Card Image」)をダウンロードしてください。
※6GB前後とサイズが大きいので注意してください

OSイメージのSDカードへの書き込み

MicroSDカードへの書き込みにはEtcherというツールを使用します。

こちらのサイトからEtcherをダウンロードし、指示に従ってインストールします。

インストールが終わったらEtcherを起動し、OSイメージを選択してSDカードに書き込みます。
image.png
書き込みが完了したら、SDカードをJetson Nano本体に差し込みます。

OSの初期設定

Jetson Nanoの電源を入れると、以下のようなライセンス確認の画面が表示されるので、Continueを押します
image.png
言語選択の画面が出るので、日本語を選択します
image.png
キーボード選択画面が出るので、日本語キーボードを選択します(USが良い人はUSを選択してください)
image.png
WiFiネットワークの選択画面が出るので、好きなネットワークを選択します
image.png
タイムゾーン選択画面が出るので、Tokyoを選択します(海外在住の方は在住地を選択してください)
image.png
ユーザ名とパスワードを設定します。
この際、「自動的にログインする」はセキュリティ的に脆弱性を作る原因となるので極力選択しないでください後述
image.png
パーティション選択画面が出ますが、基本的にはデフォルト(最大値が入力されている)のままで構いません
image.png
スワップ領域の作成有無を設定します。スワップ領域とはPyTorch等でAIのモデルを読み込む際に、メモリの不足分を補うための領域だそうです。基本的にはデフォルトの「作成する(Create SWAP File)」を選べば問題ないかと思います。
image.png
初期設定に使った余分な領域を削除するかの確認が出ますが、基本的には「続ける」を押して先に進んでください
image.png
節電設定の選択をします。基本的にはデフォルトのままで良いかと思います
image.png
これでJetPackのデスクトップが表示されるかと思います。
デスクトップ上のターミナル(LXTerminal)を開き、、下記コマンドでインストールされているパッケージをアップデートしてください

sudo apt update
sudo apt upgrade

nanoのインストール

JetPackには、デフォルトのエディタとしてvimが入っています。
vimの扱いに慣れていなければ、初心者でも扱いやすいnanoをインストールした方が無難です

sudo apt install nano

以上でセットアップは完了です。引き続いてセキュリティ対策に移ります。

セキュリティ対策

上記でJetsonの使用自体はできるようになりますが、ここからはセキュリティを高める作業を実施します。

具体的な危険ポイント

セキュリティ面におけるJetsonの危険ポイントは以下が列挙されます。
セキュリティの頑強さは利便性はトレードオフ関係があるので、必要に応じて対処の有無を選択してください。

No. 危険ポイント 対処法
1 電源を入れると自動的にログインされる設定が存在 自動ログインの解除
2 デフォルトで開いているポートが複数存在 不要なポートを閉じる
3 SSHのポート番号が固定 ポート番号を変更
4 SSHがパスワード認証 SSHを公開鍵認証に変更
5 開発の早い製品で脆弱性の発見頻度が比較的高いが、ユーザ側は更新を放置しがち こまめにアップデートを実行

※SSHのポート番号変更は実施の要否の意見が分かれるので、実施するかどうかは適宜判断してください。

具体的な対処法を下記します(上記「対処法」のリンクからも飛べます)

1.自動ログインの解除

インストール時に自動ログインを選択できますが(下図②の上)、自動ログインでは機器の電源をONするとそのままパスワード入力なしで自由に操作できるため、セキュリティの観点からは避けるべきです。
image.png
もし自動ログインを選択してしまった場合、以下の手順で解除できます。

デスクトップの左下のメニューから、設定 → ユーザとグループ を選択します
image.png
「パスワード」の項目にある「変更」をクリックします
image.png
「ログインの時にパスワードを尋ねない」のチェックを外します
image.png

2.UFWで不要なポートを閉じる

Jetsonの一般的なOSであるJetPackでは、SSHと呼ばれる遠隔操作用プロトコルのポート(TCPのポート22)がデフォルトで開放されています

前述のWebカメラが乗っ取られた例では、Telnetと呼ばれる遠隔操作用のプロトコルが悪用されました。
SSHは暗号化されているためTelnetよりはセキュリティ面で優れていますが、遠隔操作という特性上ターゲットにされやすいプロトコルなので、使用しないのであればポートを閉じた方が安全です(RaspberryPiではデフォルトで閉じています)

また、開放されているポートが多いと、攻撃者から「チョロい」と思われて攻撃を受けやすくなる心理的効果もあるので、この点でも不要なポートは閉じる方が好ましいです。
image.png

デフォルトではTCPのポート22(SSH)以外にも、TCPのポート111 (rpcbind、悪用例あり)もデフォルトで開いているようなので、これら不要なポートを以下の手順で閉じます

UFWのインストール

ポートを閉じるために、LinuxのパーソナルファイアウォールであるUFWを使用します。

下記コマンドでUFWをインストールします。

sudo apt install uwf

下記コマンドでUFWを有効化します。

sudo ufw enable

この時点でポートが全て閉じるので、対処としてはいったん完了となります。
さらに詳細な設定をしたい方は、以下の設定を必要に応じて実施してください。

IPv6を無効にする

通常はIPv4しか使用しないと思うので、その場合はIPv6を無効にします。
以下のコマンドでufwの設定ファイルを開きます

sudo nano /etc/default/ufw

ファイルの上の方にあるIPV6=yesとなっている部分を、IPV6=noに書き換えます

必要なポートを開放する

インストール完了時点では全てのポートが閉じた状態となっています。
必要なポートを開きたい時は、以下のコマンドで指定したポートを開放します

sudo ufw allow [開きたいポート番号]

例えば、https(443)のポートを開放したい時、以下のコマンドを実行します

sudo ufw allow 443

開放されているポートの確認

開放されているポート一覧は、以下のコマンドで確認できます

sudo ufw status
表示結果
To                         Action      From
--                         ------      ----
443                        ALLOW       Anywhere
443 (v6)                   ALLOW       Anywhere (v6)

ポートの開放を解除する

ポートの開放を解除(ルールを削除)したいときは、以下のコマンドを実行します

sudo ufw delete [削除したい行]

※[削除したい行]は、ポート番号ではなくstatusで表示される表の何行目かで指定します。
上記「表示結果」のルールの場合、443は1行目、443 (v6)は2行目として指定します。

ポート開放をTCPのみに絞る

少しマニアックですが、トランスポート層プロトコルにおいてTCPは許可するがUDPは許可したくないときは、以下のコマンドで実現できます。

sudo ufw allow [開きたいポート番号]/tcp

例えば22番ポート(SSH)のTCPのみを開きたい時は、

sudo ufw allow 22/tcp

となります。

送信元のIPを制限してポート開放

以下のように送信元のIPを制限すれば、セキュリティ的な強度はかなり向上します。

sudo ufw allow from [許可したいIP] to any port [開きたいポート番号] (proto [許可したいトランスポート層プロトコル])

例えば192.168.1.2から22番ポートへのTCP通信のみを許可したい場合

sudo ufw allow from 192.168.1.2 to any port 22 proto tcp

となります。

あるネットワーク全体からの通信を許可したい場合は、以下のように設定します

sudo ufw allow from [許可したいネットワークのIPアドレス]/[サブネット] to any port [開きたいポート番号] (proto [許可したいトランスポート層プロトコル])

例えば192.168.1.0/24系列のネットワークから22番ポートへのTCP通信のみを許可したい場合、

sudo ufw allow from 192.168.1.0/24 to any port 22 proto tcp

となります。

ひとまず今回は全てのポートをいったん閉じ(sudo ufw deleteでルール削除)、次の操作に進みます

3.SSHのポート番号を22から他番号に変更

デフォルトではSSHのポート番号が22となっており、このことは広く知られた事実であるため、ネットワークのIPとパスワードが分かれば遠隔操作可能となってしまいます。
ポートを変更すれば、変更後の番号も知る必要が生まれるため、セキュリティ強度が多少向上します。

※攻撃者が本腰を入れれば変更後の番号もポートスキャン等で割れる恐れがあり、変更の必要性は意見が割れています。実際に変更するかどうかは各自ご判断いただければと思います

ポート番号の変更

下記のコマンドを実行し、

sudo nano /etc/ssh/sshd_config

開かれたファイルの上の方にある
#Port 22
の部分を
Port 新ポート番号
に変更し、(コメントアウトを外すのを忘れずに)

sudo /etc/init.d/ssh restart
でSSHを再起動します。

UFWで変更後のポート番号への接続を許可

このままだと前述のUFWに弾かれてSSH接続できないので、以下のコマンドで変更後のポート番号からのTCP通信を許可リストに追加します。

sudo ufw allow [変更後のポート番号]/tcp

となります。

上記の代わりに以下のコマンドで接続元のネットワークまで制限すれば、さらにセキュリティ強度が上がるかと思います
(ただし、ネットワーク外部からSSH接続できなくなります)

sudo ufw allow from [許可したいネットワークのIPアドレス]/[サブネット] to any port [変更後のポート番号]/tcp

上記作業後、同ネットワーク内のPCから

ssh [Jetsonのユーザ名]@[JetsonのIPアドレス] -p [新ポート番号]

を実行し、パスワードを入力してSSH接続できれば成功です。

4.SSHを公開鍵認証に変更

デフォルトではSSH接続はパスワード認証で実施されますが、
よりセキュリティレベルの高い公開鍵認証が推奨されます。

パスワードは「知識認証」、公開鍵は「所持認証」にあたり、
それらを組み合わせた公開鍵認証は、多要素認証の観点からセキュリティレベルが高いそうです。

というわけで、公開鍵認証を実現するための設定を進めていきます。

秘密鍵と公開鍵の作成

※これはSSH接続元となるPC側(本例ではWindows10)での作業です。
間違えてJetsonNano側で作成した場合、id_rsaとid_rsa.pubを削除して下さい
※WindowsPCとJetsonNanoが、同ネットワークにある前提で話を進めます。

コマンドプロンプトで下のコマンドを実行します(メールアドレスは任意です)

ssh-keygen -t rsa -b 4096 -C "email@example.com"

鍵の生成場所を聞かれますが、こだわりがなければEnterでデフォルトの場所へ

Enter file in which to save the key (C:\Users\[ユーザ名]\.ssh\id_rsa):

パスワードが求められるので、
好きなパスワード(2段階認証の観点ではJetsonNanoユーザパスワードとは別のもの推奨)を入力すると、
上で指定したフォルダにid_rsa(公開鍵)とid_rsa.pub(秘密鍵)が生成されます。

公開鍵のJetsonNanoへの送信

色々とやり方(SDカード等)がありますが、ここではSSHで送信します。

JetsonNano側のホームディレクトリ直下に.sshフォルダを作成します
(権限関係でハマるので、絶対に「sudo mkdir」としないでください

mkdir ~/.ssh

PC側で下記コマンドを実施し、
SSH通信で公開鍵を送信(この時点ではパスワード認証を使用)

cd [公開鍵の場所 (デフォルトではC:\Users\[ユーザ名]/.ssh/id_rsa)]
scp -P [新ポート番号] id_rsa.pub [JetsonNanoのユーザ名]@[JetsonNanoのIPアドレス]:/home/[JetsonNanoのユーザ名]/.ssh

※JetsonNanoのIPアドレスの調べ方

ifconfig

これにより表示される

wlan0: flags=   <UP,BROADCAST,RUNNING,MULTICAST>  mtu
        inet 192.168.***.***以下続く

このinetの右に記載されている数字がJetsonNanoのIPアドレスとなります。

公開鍵のパーミッション変更

JetsonNano側で下記コマンドを実行します。

・id_rsa.pubの内容をauthorized_keysに追加

cd ~/.ssh/
cat id_rsa.pub >> authorized_keys

・authorized_keysのパーミッションを600(所有者のみ読み書き可能)に

chmod 600 authorized_keys

・.sshフォルダのパーミッションを700(所有者のみ全権限付与)に(うまくいかなければsudoを加える)

chmod 700 ~/.ssh

・公開鍵ファイルを削除

rm ~/.ssh/id_rsa.pub

※なお、過去に他のPCから本JetsonNanoに接続したことがある場合は、下記のパーミッション変更操作は不要です(公開鍵のauthorized_keysへの書込のみ必要)

chmod 600 authorized_keys
chmod 700 ~/.ssh

公開鍵認証での接続を確認
PC側で下記コマンドを実行し、公開鍵認証でSSH接続します

ssh [JetsonNanoのユーザ名]@[JetsonNanoのIP] -i [秘密鍵のパス] -p [SSHのポート番号]

※秘密鍵のパスは、ファイル名まで記載します
(デフォルトでは「C:\Users\[ユーザ名]\.ssh\id_rsa」)

公開鍵認証のパスワードが要求されるので入力します。
JetsonNanoのユーザ名が表示されれば成功です

各種SSH設定の変更

SSHのセキュリティを向上させるため、下記の設定変更を実施します。
・rootユーザでのログイン禁止
・パスワード認証を無効化して公開鍵認証のみ許可
・空パスワードを無効に

③のときと同様に、JetsonNano側でsshd_configを編集します。
※OSのバージョンによりデフォルト設定が変わりますが、
変更後さえ合っていれば問題ありません

sudo nano /etc/ssh/sshd_config

開かれたファイルに対し、下記部分を変更します
・rootユーザでのログインを禁止
上の方に記載されている
「#PermitRootLogin prohibit-password」を「PermitRootLogin no」に変更

・パスワード認証を無効化して公開鍵認証のみ許可
真ん中付近に記載されている
「#PasswordAuthentication yes」を「PasswordAuthentication no」に変更

・空パスワードを無効に
PasswordAuthenticationのすぐ下に記載されている
「#PermitEmptyPasswords no」を「PermitEmptyPasswords no」に変更

設定の反映と公開鍵認証接続の再確認

下記コマンドでSSHサービスを再起動し、設定を反映させます

sudo /etc/init.d/ssh restart

再度PC側で下記コマンド実行し、公開鍵認証接続できれば成功です!

ssh [JetsonNanoのユーザ名]@[JetsonNanoのIP] -i [秘密鍵のパス] -p [SSHのポート番号]

5.こまめにアップデートを実行(インストール時でなく継続運用時に実施)

攻撃者はセキュリティの抜け穴である「脆弱性」を突いてきますが、近年は発見された脆弱性を素早く突く攻撃が盛んに行われており、これを防ぐためにはこまめなソフトウェアのアップデートを実行し、修正パッチを適用することが何より重要です。

JetsonNanoは新機能開発が盛んに行われているという特性上、直近も脆弱性が何度か発見されており、こまめなアップデートの重要性が高い機器の一つと言えますが、一方で設置後は手を掛けたくないというIoT機器という特性上、ユーザ側は更新を放置しがちです。

脆弱性に関しては、以下のnvidiaのページにまとめられていたりしますが、これら最新情報を全てキャッチアップするのは困難だと思うので、現実的にはOSのアップデートを行う事が有効な対処となります。

手動で行う場合と、自動で行う場合を以下に示します。
状況に応じて好きな方法を選択してください。

手動アップデート

OS全体(JetPack)のアップデートを手動で実行します。
下記の記事が分かりやすいです

自動アップデート(Ubuntuのみ)

JetPackのうち、ベースとなるUbuntu部分に関しては自動更新を設定する事ができます。
下記の記事が分かりやすいです。

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
What you can do with signing up
30