UKey's Labo

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にアクセスして、アカウントを登録します。

無事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マスカレード設定を選択。

以下を設定します。

ポートが開いているか確認する

以下サイトにアクセスします。

Portチェックテスト【外部からのPort開放確】

画面項目に以下を入力します。

入力したら、Portチェック実行

以下のように表示されたら成功です。

外部からssh接続する

外部からssh接続してみる。

ssh [ユーザ名]@[ホスト名]

raspbianにログインできたら成功です。

参考サイト