メインコンテンツまでスキップ

「SSH」タグの記事が5件件あります

全てのタグを見る

· 約14分
moritalous
備考

過去のブログで掲載していた内容です。現在はGhostを使用しておりません。

ブログ始めました。プラットフォームはWordPressではなくGhostを選びました。選んだ理由と構築方法を紹介します。 ブログの構築方法を紹介しますが、まずはブログを始めようと思ったきっかけをお話しようと思います。

· 約5分
moritalous
お知らせ

過去にQiitaに投稿した内容のアーカイブです。

ポートの開放することなく、Respberry Piに外からアクセスするポートの開放することなく、Respberry Piに外からアクセスする(2020年 AWS編) に続く第3段です。

今回はOpenVPNのクラウドサービス「OpenVPN Cloud」を使います。

OpenVPN Cloud | The Next-Generation Cloud VPN Solution https://openvpn.net/cloud-vpn/

公式サイトから引用すると

A managed service that provides secure networking, over the Internet, between an enterprise’s private networks and remote users in the form of a “VPN in the Cloud”.

DeepLによる翻訳

企業のプライベートネットワークとリモートユーザーの間で、インターネットを介して安全なネットワークを提供するマネージドサービスです。

とのことです。

OpenVPNのサーバー機能をサービス提供してくれますので、Raspberry Piはサーバーではなくクライアントとしてセットアップします。そのため、ポートの開放は不要です。

2020/11時点で3接続までは無料です。10台接続の場合は、$7.50/接続のようです。 https://openvpn.net/cloud-vpn/pricing/

OpenVPN Cloudの作成と設定

https://cloud.openvpn.net/ にアクセスし、アカウントを作成しましょう。アカウント作成までに必要なものはメールアドレスのみで、クレジットカードなどは必要ありませんでした。

image.png

アカウントが作成されたら、管理画面が表示されます。

image.png

メニューの「Users」を選択しましょう。

image.png

初期状態では、Userは1つ(OpenVPN Cloudアカウントと同じもの)だけですが、プラスボタンでUserが追加できます。 Groupの設定はとりあえず「Default」でも良さそうです。

アカウントが作成できたら、「User Portal URL」に記載のあるURLにアクセスします。(OpenVPN Cloudアカウント作成時に指定したドメインです)

image.png

ここに、先程自分で作成したUserでログインします。

ログイン後、クライアントアプリのインストール方法が表示されいます。 WindowsやMac、iOS、AndroidをOpenVPNに接続する方法はこの内容に従ってインストールしましょう。

image.png

Linux向けのクライアント設定方法もリンクがあるのですが、armアーキテクチャには対応してなかったので、以下の方法でRaspberry Piの設定をしましょう

Raspberry PiのOpenVPN Client設定

もう少しブラウザでの設定が続きます。

ブラウザ上部の「MY DEVICES」を選択します。

image.png

作成したデバイスの「Download profile」ボタン(ダウンロードっぽいやつ)を押し、.ovpnファイルをダウンロードします。リージョンはお好きなところを選択してください。

さて、いよいよRaspberry Pi上での設定です。

OpenVPNのインストール OpenVPNのクライアントだけのインストール方法はわからなかったので、サーバーも一緒にインストールしちゃいます。

sudo apt install openvpn -y

OpenVPNのサーバーが起動する設定なので止めます。

sudo systemctl disable openvpn.service

先程ブラウザで入手した.ovpnファイルを/etc/openvpn/client.confとして保存します。 拡張子も変えてしまいます。

OpenVPNのクライアントだけサービス起動するように設定し、起動します。

sudo systemctl enable [email protected]
sudo systemctl start [email protected]

トンネルインターフェイスが作成されます

pi@raspberrypi:~ $ ip addr show tun0
4: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 100
link/none
inet 100.96.1.4/28 brd 100.96.1.15 scope global tun0
valid_lft forever preferred_lft forever
inet6 fd:0:0:8100::4/64 scope global
valid_lft forever preferred_lft forever
inet6 fe80::a644:7126:6232:c17b/64 scope link stable-privacy
valid_lft forever preferred_lft forever
pi@raspberrypi:~ $

これで、もう一つOpenVPNのクライアントをインストールした環境から接続ができるようになります。

· 約7分
moritalous
お知らせ

過去にQiitaに投稿した内容のアーカイブです。

外出時に自宅のラズパイが気になることありませんか? ブラウザさえあれば、Azure Cloud Shellからアクセスできますので、紹介します。

仕組み

IoT Hub デバイス ストリームの機能を使います。2020/11/1現在プレビュー状態ですが、誰でも試すことが可能です。

Azure IoT Hub デバイス ストリームによって、さまざまな cloud-to-device 通信シナリオのセキュリティで保護された双方向 TCP トンネルの作成が容易になります。 デバイス ストリームは、デバイスとサービス エンドポイント間のプロキシとして機能する、IoT Hub ストリーミング エンドポイントによって仲介されます。

device-stream-proxy-diagram.png

(画像は公式サイトのものです) https://docs.microsoft.com/ja-jp/azure/iot-hub/iot-hub-device-streams-overview

IoT Hubが仲介することで、通常はファイアーウォールに防がれてアクセスできないRaspberry Piに外部からアクセスできるようになります。

環境

デバイス側

Raspberry Pi 3 Raspberry Pi OS (32-bit) Lite 最新版(2020-08-20)

セットアップ

以下の手順で進めます。

  1. Azure IoT Hubの設定
  2. デバイス(Raspberry Pi)側の設定
  3. サービス(Azure Cloud Shell)側の設定

1. Azure IoT Hubの設定

Azure IoT Hubの作成は、Azure Cloud Shellで実行します。

Azure IoT 拡張機能を追加

AzureCloudShell
az extension add --name azure-iot

Azure IoT Hubを作成

無料のSKUで作成します。 デバイスストリームに対応しているリージョンは限られています。

  • 米国中部
  • 米国中部 EUAP
  • 東南アジア
  • 北ヨーロッパ
AzureCloudShell
az iot hub create --name [IoT Hub名] --resource-group [リソースグループ名] --location centralus --sku f1 --partition-count 2

デバイスを作成

Raspberry PiがIoTデバイス扱いとなりますので、IoT Hubにデバイスを作成します。デバイスIDはraspberrypiとしました。

AzureCloudShell
az iot hub device-identity create --hub-name [IoT Hub名] --device-id raspberrypi

接続文字列を取得

接続文字列は2種類必要です。

デバイス(Raspberry Pi)側で使用する接続文字列

AzureCloudShell
az iot hub device-identity connection-string show --hub-name [IoT Hub名] --device-id raspberrypi --output tsv

サービス(Azure Cloud Shell)側で使用する接続文字列

AzureCloudShell
az iot hub connection-string show --policy-name service --hub-name [IoT Hub名] --output tsv

これで、Azure IoT Hubの設定は完了です。

2. デバイス(Raspberry Pi)側の設定

つづけてRaspberry Piの設定です。 OSをインストールした直後の状態から進めたいと思います。

必要なソフトウェアのインストール

RaspberryPi
sudo apt install git cmake libssh-dev libcurl4-openssl-dev uuid-dev -y

デバイス側ソースの取得

パブリックプレビュー用ブランチを使用します。

RaspberryPi
git clone -b public-preview https://github.com/Azure/azure-iot-sdk-c.git
cd azure-iot-sdk-c
git submodule update --init

ソースの修正

azure-iot-sdk-c/iothub_client/samples/iothub_client_c2d_streaming_proxy_sampleにあるiothub_client_c2d_streaming_proxy_sample.cにデバイス側で使用する接続文字列を指定します。(70行目です)

iothub_client_c2d_streaming_proxy_sample.c
static const char* connectionString = "[device connection string]";

makeする

公式ドキュメントではmake -jと書いてありますが、メモリ不足で失敗しますので、-jは外しました。

RaspberryPi
cd ~/azure-iot-sdk-c/
mkdir cmake
cd cmake
cmake ..
make

makeが成功するとazure-iot-sdk-c/cmake/iothub_client/samples/iothub_client_c2d_streaming_proxy_sample/iothub_client_c2d_streaming_proxy_sampleが生成されます

わかり易い場所に移動します。

RaspberryPi
mkdir ~/bin
cp iothub_client/samples/iothub_client_c2d_streaming_proxy_sample/iothub_client_c2d_streaming_proxy_sample ~/bin/

自動起動の設定

serviceファイルを作成します。

iothub_client_c2d_streaming_proxy.service
[Unit]
Description=IoT Hub Client C2D Streaming Proxy
After=network.target

[Service]
ExecStart=/home/pi/bin/iothub_client_c2d_streaming_proxy_sample
WorkingDirectory=/home/pi/bin
StandardOutput=inherit
StandardError=inherit
Restart=always
User=pi

[Install]
WantedBy=multi-user.target

serviceを有効にして起動します。

RaspberryPi
sudo mv ~/iothub_client_c2d_streaming_proxy.service.service /etc/systemd/system/
sudo systemctl enable iothub_client_c2d_streaming_proxy.service
sudo systemctl start iothub_client_c2d_streaming_proxy.service

デバイス(Raspberry Pi)側の設定は完了です。

3. サービス(Azure Cloud Shell)側の設定

サービス側のサンプルはNode.jsで動作します。Azure Cloud Shellで提供されているNode.jsのバージョンはv8.16.0ですが、v10以上が必要なので、まずはNode.jsをセットアップします。

Node.jsのインストール

AzureCloudShell
wget https://nodejs.org/dist/v10.19.0/node-v10.19.0-linux-x64.tar.gz
mkdir ~/node
tar zxf node-v10.19.0-linux-x64.tar.gz -C ~/node/
cd node
ln -s node-v10.19.0-linux-x64 node
echo 'export PATH=~/node/node/bin:$PATH' >> ~/.bashrc
source ~/.bashrc

サービス側ソースの取得

AzureCloudShell
wget https://github.com/Azure-Samples/azure-iot-samples-node/archive/streams-preview.zip
unzip streams-preview.zip
mv azure-iot-samples-node-streams-preview/iot-hub/Quickstarts ~/

外部ライブラリーの取得

AzureCloudShell
cd ~/Quickstarts/device-streams-service/
npm install azure-iothub@streams-preview
npm install

環境変数の設定

Node.jsのプログラムは環境変数を参照するようですので、必要な情報を環境変数にセットします。 IOTHUB_CONNECTION_STRINGにサービス側で使用する接続文字列をセットします。 ※Azure CLIで取得して設定するように工夫してみました

AzureCloudShell
echo 'export IOTHUB_CONNECTION_STRING="`az iot hub connection-string show --policy-name service --hub-name [IoT Hub名] --output tsv`"'>> ~/.bashrc
echo 'export STREAMING_TARGET_DEVICE=raspberrypi' >> ~/.bashrc
echo 'export PROXY_PORT=2222' >> ~/.bashrc
source ~/.bashrc

これでサービス(Azure Cloud Shell)側の設定は完了です。

接続

準備は整いましたので、実際に接続してみましょう。 デバイス側はもう特に触りませんので、Azure Cloud Shell上で作業します。

AzureCloudShell
cd ~/Quickstarts/device-streams-service/
node proxy.js &
ssh pi@localhost -p 2222

Node.jsのProxyプログラムはフォアグラウンドで動作する仕組みなのでバックグラウンドで動作させます。 localhost(=Azure Cloud Shell)の2222ポートにSSHで接続することで、デバイス側に接続ができます。

Azure Cloud Shellのインスタンスが停止したあとでも、接続の手順を行うとデバイス側に接続できます。

AzureのAndroidアプリからもこの通り。 これでいつでもどこでもRaspberry Piにアクセスできますね。

Screenshot_20201101-205702.png

参考サイト

https://docs.microsoft.com/ja-jp/azure/iot-hub/iot-hub-device-streams-overview https://docs.microsoft.com/ja-jp/azure/iot-hub/quickstart-device-streams-proxy-c https://docs.microsoft.com/ja-jp/azure/iot-hub/quickstart-device-streams-proxy-nodejs

· 約3分
moritalous
お知らせ

過去にQiitaに投稿した内容のアーカイブです。

やってみると意外と簡単。 パスワード入力が不要になるので、やって見る価値はあるかと。

SSHされる側(ホスト側のRaspberry Pi)での設定

SSHサーバーの設定変更

デフォルトでは鍵認証が有効になっていないので、設定を変更します。

RaspberryPi
sudo sed -i 's/#PubkeyAuthentication/PubkeyAuthentication/g' /etc/ssh/sshd_config
sudo sed -i 's/#AuthorizedKeysFile/AuthorizedKeysFile/g' /etc/ssh/sshd_config

sudo systemctl restart sshd.service

SSHで使用する鍵の作成

RaspberryPi
pi@raspberrypi4:~ $ ssh-keygen -t rsa -b 4096 -C "moritalous"
Generating public/private rsa key pair.
Enter file in which to save the key (/home/pi/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/pi/.ssh/id_rsa.
Your public key has been saved in /home/pi/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:xxxxxxxxx
The key's randomart image is:
+---[RSA 4096]----+
|xxxxxxxxxxxxxxxxx|
|xxxxxxxxxxxxxxxxx|
|xxxxxxxxxxxxxxxxx|
|xxxxxxxxxxxxxxxxx|
|xxxxxxxxxxxxxxxxx|
|xxxxxxxxxxxxxxxxx|
|xxxxxxxxxxxxxxxxx|
|xxxxxxxxxxxxxxxxx|
|xxxxxxxxxxxxxxxxx|
+----[SHA256]-----+
pi@raspberrypi4:~ $

~/.ssh/にid_rsa(秘密鍵)とid_rsa.pub(公開鍵)が作成されます。

公開鍵の方をauthorized_keysに登録します。

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

SSHする側(クライアント側のmac/Windows)での設定

秘密鍵の配置と権限変更

ホスト側で作成したid_rsa(秘密鍵)を持ってきます。 私は~/.ssh/raspberrypi4/の配下(Windowsの場合は%USERPROFILE%\.ssh\raspberrypi4)に保存しました。

権限変更はmacの場合のみ。Windowsの場合は不要でした。

macのみ
chmod 600 ~/.ssh/raspberrypi4/id_rsa

設定ファイルの作成

macの場合もWindowsの場合も、IdentityFileの指定は同じです。Windowsだからといって%USERPROFILE%と書いたり、エスケープ文字が\(円)になったりしません。

~/.ssh/config
Host raspberrypi4.local
HostName raspberrypi4.local
User pi
IdentityFile ~/.ssh/raspberrypi4/id_rsa

Host raspberrypi3.local
HostName raspberrypi3.local
User pi
IdentityFile ~/.ssh/raspberrypi3/id_rsa

これで、パスワードなしでSSH接続できます。

mac/Windows
$ ssh [email protected]
Linux raspberrypi4 5.4.51-v8+ #1333 SMP PREEMPT Mon Aug 10 16:58:35 BST 2020 aarch64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
You have new mail.
Last login: Sun Oct 18 16:26:01 2020 from 192.168.0.8

pi@raspberrypi4:~ $

VSCodeのSSH接続の拡張機能(Remote - SSH)を使った場合もパスワード無しで、接続されます。 わーい EC2の接続に必要な鍵もこうやって管理すればいいんですね。

· 約4分
moritalous
お知らせ

過去にQiitaに投稿した内容のアーカイブです。

2017年に書いたポートの開放することなく、Respberry Piに外からアクセスするの第2弾です。

自宅に設置したRaspberry Piに外出先からアクセスしたいことってありますよね。 でも、そのためだけにルーターのポートを解放するのも、セキュリティが心配。

今回はAWS Systems Manager Session Managerを使う方法をご紹介します。 SSHもVNCもポートの開放も不要ですよ!

AWS Systems Manager Session Managerとは

公式サイトによると

Session Manager はフルマネージド型 AWS Systems Manager 機能であり、インタラクティブなワンクリックブラウザベースのシェルや AWS CLI を介して Amazon EC2 インスタンス、オンプレミスインスタンス、および仮想マシン (VM) を管理できます。

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager.html

基本的にはEC2へのログインに使うと便利なものですが、実はSystems Managerはオンプレ環境でも使用でき、Session Manager機能もEC2でなくても利用できるのです。

導入手順

以下、手順を追って説明します。

IAMサービスロールを作成する

IAMロールを作成します。

項目内容
名称SSMServiceRole(任意の名前)
ポリシーAmazonSSMManagedInstanceCore(AWS 管理ポリシー)
信頼関係ssm.amazonaws.com

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/sysman-service-role.html

アクティベーションを作成する

Raspberry PiにSSMエージェントをインストールする際に必要なアクティベーションキーを作成します。

マネジメントコンソールのハイブリッドアクティベーションメニューから作成します。

項目内容
インスタンス制限1(任意の数)
IAM ロールSSMServiceRole(上の手順で作ったもの)
デフォルトのインスタンス名Raspberry Pi(任意の名前)

作成したあと、画面上にアクティベーションコードアクティベーションIDが表示されるのでメモしておきます。

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/sysman-managed-instance-activation.html

SSMエージェントをインストールする

ここはRaspberry Pi上での作業となります。

mkdir /tmp/ssm
sudo curl https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/debian_arm/amazon-ssm-agent.deb -o /tmp/ssm/amazon-ssm-agent.deb
sudo dpkg -i /tmp/ssm/amazon-ssm-agent.deb
sudo service amazon-ssm-agent stop
sudo amazon-ssm-agent -register -code "[activation-code]" -id "[activation-id]" -region "ap-northeast-1"
sudo service amazon-ssm-agent restart

[activation-code][activation-id]は前の手順でメモしたものを使用します。

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/sysman-install-managed-linux.html

これで設定は完了です。 設置が完了すると、Session ManagerのマネージドインスタンスのところにRaspberry Piが追加されます。

image.png

接続手順

Session Managerのマネージドインスタンスのところでインスタンスを選択し、アクション -> Start Sessionを選択すると、ブラウザ上でターミナルの画面が表示されます。

これ、ブラウザの画面です。すごいですね。su - piとすることでpiユーザーへの切り替えもできます。

image.png

これでいつでもどこでもRaspberry Piと一緒です。 SSHもVNCも不要です。すごいですね。