Raspberry pi – RaspbianにリモートでSSH接続する

リモートでSSH接続するためにも、セキュリティを考慮した設定に変更しておく。
以下、ローカルネットワーク内でRaspbianにssh接続しての作業を想定しています。
動作環境
環境 | バージョン |
---|---|
PC | macbook air 2013 |
OS | MacOS Mojave 10.14.1 |
Raspbian | aspbian GNU/Linux 9.4 (stretch) |
rootにパスワード設定して、rootにログインできるようにする
初期状態だとrootにパスワードが設定されていないため、rootにログインできません。
なので、rootにパスワードを設定します。
sudo passwd root
新しいパスワードを2回入力する必要があります。
設定したら、rootにログイン。
su -
Password: #←パスワードを入力
SSH is enabled and the default password for the 'pi' user has not been changed.
This is a security risk - please login as the 'pi' user and type 'passwd' to set a new password.
[email protected]:~#
rootにログインできることが確認できたら、rootからログアウトしておきます。
exit
新規ユーザを追加して、piと同じ権限にする
リモート接続でポートを開放するので、セキュリティ面を考慮して、piは使用せず別ユーザでログインするようにする。
まず、新規ユーザを追加。
sudo adduser [新規ユーザ名]
piができることは、新規ユーザでも全てできるようにするために、
piが所属しているグループに新規ユーザも追加する。
まずは、piの所属グループを確認。
groups pi
pi : pi adm dialout cdrom sudo audio video plugdev games users input netdev spi i2c gpio
adm
以下をコピーして、テキストエディタ等でスペース→”,”(カンマ)に変換して、以下のコマンドに貼り付けて、新規ユーザをpiと同じグループに追加する。
sudo usermod -G adm,dialout,cdrom,sudo,audio,video,plugdev,games,users,input,netdev,spi,i2c,gpio [新規ユーザ名]
新規ユーザのグループを確認する。
groups [新規ユーザ]
piと同じグループが表示されれば完了。
別のコンソールをもうひとつ開いて、新規ユーザでもログインできるか確認してみる。
# 新規ユーザでログインしてみる
ssh [新規ユーザ名]@raspberrypi.local
piを削除する
piを残しておくと、新規ユーザを作成した意味がないので、piユーザを削除します。
ちなみにここから先、新規ユーザはhogeとすることにします。
# hogeでログイン
ssh [email protected]
# piを削除
sudo userdel -r pi
[sudo]password for hoge: #←hogeのパスワードを入力
SSH秘密鍵を生成する
rsa形式で鍵を生成
ssh-keygen -t rsa
鍵を生成したら、公開鍵認証でログインできるように準備。
# .sshフォルダへ移動
cd ~/.ssh/
# 公開鍵を追加する
cat id_rsa.pub >> authorized_keys
# 公開鍵の権限を変更しておく
chmod 600 authrized_keys
# 元の公開鍵を削除
rm -f id_rsa.pub
秘密鍵をmacに移動する
別のコンソールを開き、scp
コマンドで鍵を移動。
scp [ログインユーザ名]@[アドレス]:/[id_rsaまでのフルパス] [コピー先]
scp [email protected]:/home/hoge/.ssh/id_rsa ~/.ssh/
Raspbian側のssh設定を変更
# ssh設定ファイルを開く
vim /etc/ssh/sshd_config
以下を修正
# コメントアウトを外し、"no"に修正
#PermitRootLogin yes
↓
PermitRootLogin no #←rootでのログイン禁止
# コメントアウトを外し、"no"に修正
#PasswordAuthentication yes
↓
PasswordAuthentication no #←パスワードでのログイン禁止
# コメントアウトを外す
#PermitEmptyPasswords no
↓
PermitEmptyPasswords no #←空パスワードでの認証禁止
ssh.serviceを再起動
sudo systemctl restart ssh
# 問題なく起動しているか確認
systemctl | grep ssh
ssh.service loaded active running OpenBSD Secure Shell server
秘密鍵を使いログインしてみる
別コンソールを開く。 ※ここで全てのコンソールでraspbianからログアウトしてしまうと、sshの設定を失敗してしまっている場合にraspbianに接続できなくなり、最初(raspbianのインストール)からやり直しになってしまうので、最低でも1つはraspbianにログインしている状態のコンソールを残しておくこと!
# raspbianへの秘密鍵をsshに追加
ssh-add ~/.ssh/id_rsa
Enter passphrase for /Users/user/.ssh/id_rsa: #←秘密鍵パスフレーズを入力
Identity added: /Users/user/.ssh/id_rsa (/Users/user/.ssh/id_rsa)
# ssh接続
ssh [email protected]
DDNSに登録する
無料で使用できるダイナミックDNSサービス、no-ipを使用します。
no-ipにアクセスして、アカウントを登録します。
- Email : メールを受信できるアドレスを入力。
- Password : no-ipへのログインパスワードを設定
- Hostname : ホスト名を設定します。raspbianに接続するときに使用します。後で設定する場合は、「Create my hostname later」にチェックを入れておきます。
- Terms of Service and Privacy Policy : プライバシーポリシーうんぬんに同意して、チェックを入れる。英語苦手なので、詳しいことは割愛(苦
- Email Opt-In : no-ipからサービスメールを受け取る場合はチェックを入れる。
- サインアップ:ここでは無料でサービスを利用したいので、「Free Sign Up」をクリック。
無事Sign Upが完了すると、登録したメールアドレスにメールが届くので、そのメールの「Confirm Account」をクリックする。
アカウントが使用可能になる。
ホスト名をまだ設定していない場合は、管理画面の「Dynamic DNS」から設定しておく。
DDNSのクライアントをraspbianにインストールする
DDNSクライアントをraspbianにインストールすることで、グローバルIPアドレスが変更になっても、自動でグローバルIPアドレスとホスト名を紐づけてくれます。
raspbianにssh接続して、以下を実行していきます。
ssh [email protected]
wget https://www.noip.com/client/linux/noip-duc-linux.tar.gz
# tarボールを解凍する
tar zxvf noip-duc-linux.tar.gz
# 解凍してできたnopiディレクトリに移動
cd noip-2.1.9-1/
# ソースをコンパイル
make
gcc -Wall -g -Dlinux -DPREFIX=\"/usr/local\" noip2.c -o noip2
noip2.c: In function ‘dynamic_update’:
noip2.c:1595:6: warning: variable ‘i’ set but not used [-Wunused-but-set-variable]
int i, x, is_group, retval, response;
^
noip2.c: In function ‘domains’:
noip2.c:1826:13: warning: variable ‘x’ set but not used [-Wunused-but-set-variable]
int x;
^
noip2.c: In function ‘hosts’:
noip2.c:1838:20: warning: variable ‘y’ set but not used [-Wunused-but-set-variable]
int x, y, z;
^
# ↑エラーっぽいのが出力されるけど、無視する
# インストール
sudo make install
if [ ! -d /usr/local/bin ]; then mkdir -p /usr/local/bin;fi
if [ ! -d /usr/local/etc ]; then mkdir -p /usr/local/etc;fi
cp noip2 /usr/local/bin/noip2
/usr/local/bin/noip2 -C -c /tmp/no-ip2.conf
Auto configuration for Linux client of no-ip.com.
Please enter the login/email string for no-ip.com [email protected] #←no-ipに登録したメールアドレスを入力
Please enter the password for user '[email protected]' ************* #←ログインパスワード入力
You have entered an incorrect username
-or-
an incorrect password for this username.
mv /tmp/no-ip2.conf /usr/local/etc/no-ip2.conf
mv: cannot stat '/tmp/no-ip2.conf': No such file or directory
Makefile:28: recipe for target 'install' failed
make: *** [install] Error 1
メールアドレスもログインパスワードも間違ってないはずなのにエラーが発生してインストールできない
no-ipのサイトで何度もログインしてみて、パスワードを何度も変更してみてリトライしてみましたが、駄目でした。
何故だ!?と途方に暮れていましたが、以下を実行することで、解決できました。
# /tmp/にno-ip2.confファイルを手動で作成する
touch /tmp/no-ip2.conf
これで再度、make install
を実行してみましょう。
sudo make install
if [ ! -d /usr/local/bin ]; then mkdir -p /usr/local/bin;fi
if [ ! -d /usr/local/etc ]; then mkdir -p /usr/local/etc;fi
cp noip2 /usr/local/bin/noip2
/usr/local/bin/noip2 -C -c /tmp/no-ip2.conf
Auto configuration for Linux client of no-ip.com.
Please enter the login/email string for no-ip.com [email protected]
Please enter the password for user '[email protected]' *********
Only one host [XXX.hopto.org] is registered to this account.
It will be used.
Please enter an update interval:[30] #← IPアドレスのチェック頻度。単位は分。変更しない場合はそのままEnter
Do you wish to run something at successful update?[N] (y/N) N #←とりあえずN(苦)でEnter
New configuration file '/usr/local/etc/no-ip2.conf' created.
インストールできました。
DDNSクライアントの自動起動設定
# DDNSクライアントの起動/停止を行うshellをnoip2としてコピー
sudo cp debian.noip2.sh /etc/init.d/noip2
# 起動時にnoipも自動起動されるようにrc.localに記述を追加
sudo vim /etc/rc.local
# exit 0の前に以下を記述
/etc/init.d/noip2 start
ここまでできたら、一旦noip2を停止して、再設定を行います。
# noip2の停止
sudo /etc/init.d/noip2 stop
# 再設定
sudo /usr/local/bin/noip2 -C # make install時の設定を再度行う
# noip2を再度起動
sudo /etc/init.d/noip2 start
起動時にnoip2が自動起動するか確認する
raspbianを再起動します。
sudo reboot
# ssh接続が切れる
しばらく待って…
# sshで再ログイン
ssh [email protected]
# noip2のステータスを確認
/usr/local/bin/noip2 -S
1 noip2 process active.
Process 660, started as noip2, (version 2.1.9)
Using configuration from /usr/local/etc/no-ip2.conf
Last IP Address set XXX.XXX.XXX.XXX
Account [email protected]
configured for:
host XXX.hopto.org
Updating every 30 minutes via /dev/wlan0 with NAT enabled.
こんな感じでステータスが表示されていれば、raspbian起動時に、noip2も自動起動できている。
ポートを開放する
ここは各環境で異なるので記載しにくいですが、とりあえず僕の環境の場合を記載します。
うちのモデムはNTT PR-400MIです。
初期設定だと、管理コンソールへはwebブラウザのURLに、http://192.168.1.1
を入力すればアクセスできたかと。
ローカルIPアドレスを固定で設定する
DHCPをPR-400MIで設定している場合。
動的に割り振られたローカルIPアドレスが今までと変わってしまった場合は、外部からアクセスできなくなるので、ラズパイのローカルIPアドレスを固定で設定してしまいましょう。
ラズパイのMACアドレスを調べます。
ifconfig
...
ether AA:BB:CC:DD:EE:FF...
ether
のあとにある、:”コロン”区切りの16桁の値をメモします。
管理コンソールで、詳細設定 > DHCPv4サーバ設定 > DHCP固定IPアドレス設定
へと進めます。
【DHCP固定IPアドレスエントリ】で、先程メモしたMACアドレスを入力、IPアドレスは現状192.168.1.18
がラズパイに自動で割り振られているため、そのまま設定しました。
静的IPマスカレード設定
WAN側からLAN側に、sshのポート22を目指してアクセスがあった場合に、ラズパイに接続するように設定します。
詳細設定 > 静的IPマスカレード設定
を選択。
以下を設定します。
- 有効/無効 : 有効
- 変換対象プロトコル : TCP
- 変換対象ポート : 22
- 宛先アドレス : 192.168.1.18(ラズパイに固定で設定したIPアドレス)
- 宛先ポート : 22
ポートが開いているか確認する
以下サイトにアクセスします。
画面項目に以下を入力します。
- ホスト名 : no-ipで登録したホスト名
- チェックポート番号 : 22
- 無料でご利用いただけますが「ご注意・制約事項」を確認下さい : チェックを入れる
入力したら、Portチェック実行
以下のように表示されたら成功です。
外部からssh接続する
外部からssh接続してみる。
ssh [ユーザ名]@[ホスト名]
raspbianにログインできたら成功です。