電源入れたら勝手に仮想通貨の自動売買してくれるおもちゃの作り方

# 趣旨
本格的なbotを作れるようになったら取引所のサーバーの近くにスペックの高いサーバーを借りて少しでも通信速度を上げた方が有利になるんですが、私の技術ではまだその土俵に立てていないのでラズパイを自動売買するおもちゃに変えて遊んでいます。

結構面白いし、愛着が湧くので備忘録を残しておきます。

# ラズパイ初期設定

ラズパイの初期設定は＠HoshimuraYutoさんのブログが一番参考になります。

https://twitter.com/HoshimuraYuto

https://sukiburo.jp/setup-raspberry-pi/

ラズパイの操作方法にはVNC接続とSSH接続がありますが、勉強のためにやるのならSSH接続の方が後々タメになると思います。

# セキュリティ設定
botの種類によってはラズパイをサーバーとして外部に公開することもあるかも知れませんし、仮想通貨をやるならセキュリティ対策しておく方がよいので＠HoshimuraYutoさんのセキュリティ解説ページを読み進めます。

https://sukiburo.jp/raspberry-pi-firewall/#2-5

さらに公開鍵・秘密鍵を利用して秘密鍵を保有しているパソコンからじゃないとラズパイにアクセスできないように設定します。

### Macでラズベリーパイに公開鍵を使ってSSH接続する方法

まず、MacでSSHキーペアを生成します。Terminalを開いて以下のコマンドを実行します。

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

ここで、your_email@example.comは実際のメールアドレスに置き換えてください。これはコメントとして使用されます。
コマンドを打つとファイル名とそのパスワードを入力するよう求められます。

キーペアが生成されると、~/.sshディレクトリにid_rsa（秘密鍵）とid_rsa.pub（公開鍵）が作成されます。

次に、ラズベリーパイのauthorized_keysファイルに公開鍵を追加します。まず、ラズベリーパイのIPアドレスを調べます。ラズベリーパイで以下のコマンドを打ってください。

```
hostname -I
```

MacのTerminalで、以下のコマンドを実行して公開鍵をラズベリーパイにコピーします。

```
scp raspberrypi.pub your_pi_username@your_pi_IP_address:~/
```

次にラズベリーパイにSSH接続します。
```
ssh your_pi_username@your_pi_IP_address
```

ラズベリーパイに接続したら、公開鍵を~/.ssh/authorized_keysファイルに追加します。まず、~/.sshディレクトリが存在するか確認します。
```
mkdir -p ~/.ssh
```

次に、raspberrypi.pubをauthorized_keysファイルに追加します。
```
cat raspberrypi.pub >> ~/.ssh/authorized_keys
```

公開鍵ファイルのパーミッションを変更します。

```
chmod 600 ~/.ssh/authorized_keys
```

ラズベリーパイからログアウトします。
```
exit
```

通常のSSHでまだログインできてしまう場合はPasswordAuthenticationを変更する必要があります。

ラズベリーパイでSSHサーバーの設定ファイルを編集します。
```
sudo nano /etc/ssh/sshd_config
```

設定ファイル内で、以下の行を探し、PasswordAuthenticationがnoに設定されていることを確認します（コメントアウトされていないことも確認してください）。
```
PasswordAuthentication no
```

設定を変更した場合は、ファイルを保存しSSHサービスを再起動します。

```
sudo systemctl restart ssh
```

ラズベリーパイからログアウトします。
```
exit
```
# 不必要なProtocolのシャットダウン

:::note warn
本項はラズパイ側での作業になります。
:::

`avahi-daemon：Bonjour`：プロトコルを使用してネットワーク上のデバイスを自動的に検出するためのサービスですが、このサービスは、不要なデバイスがネットワークに接続された場合に攻撃のターゲットになる可能性があるため、停止します。

`bluetooth.service`：Bluetooth接続を管理するためのサービスですが、Bluetoothはbotに必要ありませんし、セキュリティを破られる突破口になりかねないので停止します。

`cups-browsed.service`：プリンターを自動的に検出して設定するためのサービスですが、このサービスは不要なデバイスがネットワークに接続された場合に攻撃のターゲットになる可能性があるため停止します。

`nfs-server.service`：NFS（Network File System）サービスを提供するためのサービスなので停止します。


### 例① cups-browsed.service 

cups-browsed.serviceを停止する方法は以下の通りです。

ターミナルを開きます。

次のコマンドを打って、cups-browsed.serviceの状態を確認します。

```
systemctl status cups-browsed.service
```

cups-browsed.serviceが実行中の場合、次のコマンドを打って停止します。

```
sudo systemctl stop cups-browsed.service
```

cups-browsed.serviceが自動起動されるように設定されている場合、以下のコマンドを打って自動起動を無効にします。

```
sudo systemctl disable cups-browsed.service
```

これで cups-browsed.service が停止され、自動起動も無効になります。

### 例② bluetooth.service

bluetooth.service を停止する方法は以下の通りです。

以下のコマンドを打って、bluetooth.serviceの状態を確認します。

```
systemctl status bluetooth.service
```

bluetooth.service が実行中の場合、以下のコマンドを打って停止します。

```
sudo systemctl stop bluetooth.service
```

bluetooth.service が自動起動されるように設定されている場合、次のコマンドを打って自動起動を無効にします。

```
sudo systemctl disable bluetooth.service
```

これで bluetooth.service が停止され、自動起動も無効になります。

cups-browsedとnfs-server に関するコマンドは名称を変えるだけで同じなので省略します。

# config.pyにアクセス制限
私はconfig.pyと使う形式が楽なのでconfig.pyに制限をかけて自分のMacでしかアクセスできないよう公開鍵を設定した上でconfig.pyにアクセスできるラズパイ上のユーザーも制限しています。

config.pyのパーミッションを変更して、書き込み権限を取り除きます。

```
chmod 644 config.py
```

config.pyファイルの所有者とグループには読み取りと書き込みが許可されますが、その他のユーザーには読み取り権限しかありません。

以下のコマンドを実行することで、config.pyファイルの所有者を確認することができます。

```
ls -l config.py
```

所有者をuserユーザーに変更するには、以下のコマンドを打ちます。

:::note warn
userの部分は自分のユーザー名に変えてコマンドを打ちます。
:::

```
sudo chown user:user config.py
```

config.pyにアクセスできるユーザーの一覧を確認するには、以下のコマンドを実行します。

```
getfacl config.py
```

ファイルのパーミッションを変更して、所有者以外からのアクセスを禁止します。

```
sudo chmod 600 config.py
```
# botを起動する

## cron
cronを設定すれば一定期間毎にプログラムを自動で実行してくれるようになるので、これが最も手っ取り早いですね。コンセントにラズパイの電源を刺すだけであとはcronがタスクを実行してくれるようになります。

https://qiita.com/danieltanaka/items/661aa8734c555b8cd5df

## flask
flaskのような常に起動させておかないといけないプログラムの場合はもう少し複雑です。

https://qiita.com/danieltanaka/items/eaf04fd3f847966bc9d9

以下にその際の設定方法を記載します。

```
sudo nano /etc/systemd/system/flask_app.service
```

以下の内容を保存します。

:::note warn
USERの部分は自分のユーザー名に変える必要があります。
:::

```
[Unit] Description=Flask App Service After=network.target
[Service] ExecStart=/usr/bin/python /home/USER/flask_app.py 
WorkingDirectory=/home/USER/ 
StandardOutput=inherit 
StandardError=inherit 
Restart=always 
User=PI
[Install] WantedBy=multi-user.target
```

リロードします。
```
sudo systemctl daemon-reload
sudo systemctl enable flask_app.service
```
これで電源を入れただけで勝手に売買を始めてくれるおもちゃのできあがりです。
スピーカーつけて売買する度にチャリンと音を鳴らして売買結果を読み上げるようにもできるので、それも面白いと思います。