【OCI】無料でLinuxサーバを立ち上げてSSH接続してみた

以前はWebアプリの開発自習用にHeroku[^1]を使用していたのですが、悪意のあるユーザによる不正利用が多発した為に個人の利用であっても有償となってしまいました。
以降はローカルでプログラミングしていたものの、久しぶりに公開できるWebアプリを作りたいと思い立ち、無償でお気軽に使えるパブリッククラウドのLinuxはないかしらと軽く調べてみたところ、Oracle Cloud Infrastructure（OCI）のAlways Freeサービスで提供されていて、弊社内でも他部署でOCIに関わるサービスを扱っていることもあり、OCIのお勉強も兼ねて環境を作ってみることにしました。

# 実施環境
* Mac OS
Windowsの場合、SSH接続手順が異なるのでご容赦ください。

# 必要なもの
* メールアドレス
→アカウント作成時に必要です。
* クレジットカード
→無償利用でもクレジットカード登録が必要になります。
* スマートフォン
→多要素認証で使用します。

# アカウント作成
所要時間 : 10分程度
以下 @fufukuku さんの記事の「個人アカウント作成」〜「設定１：MFAの設定」を実施してください。
2024年10月時点でも手順に特に変わりはありませんでした。

https://qiita.com/fufukuku/items/af58e01ec0ee93f063b0

# 仮想マシン（VM）起動
所要時間 : 5分程度

1. OCIサインイン
下記URLからOCIのホーム画面にサインインします。
https://cloud.oracle.com/home

1. VMインスタンス作成
下図、リソースの起動＞VMインスタンスの作成をクリックします。
![SS001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551450/4bbc9d94-7510-6372-ca80-d60418b73bad.png)

1. VMインスタンス設定入力
下図、インスタンスの名前に適当な名称を設定します。
![SS002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551450/b5b4a36e-e51e-6234-dcb9-946c25478595.png)
コンパートメントはデフォルトのままでOK。
その他、「配置」「セキュリティ」等も全てデフォルトのままでOK。

1. 秘密鍵ダウンロード
SSH接続できるよう、下図「秘密キーの保存」ボタンをクリックしてダウンロードします。
![SS003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551450/ed2275ff-6ccc-cd06-bb68-a5a90b40e2f9.png)

1. VM作成
画面下部、下図の「作成」ボタンをクリックします。
![SS004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551450/0623b5ec-5ebf-641b-6650-fae9a56d9d81.png)

1. 待機
VMの状態が「プロビジョニング中」から下図「実行中」になるまで待機します。
早ければ30秒程度で切り替わります。
![SS005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551450/1649ed4f-2ec8-9f6f-adcf-bcadded8e47c.png)

1. VMのパブリックIPアドレス確認
下図赤枠、インスタンス情報＞プライマリVNICにパブリックIPv4アドレスが表示されるので控えておきます。
![SS006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551450/ff059da7-ac0c-f4a6-bd1c-824a95fa8e34.png)

以上でVMの作成は完了。

# デフォルトユーザでのSSH接続
まずは前項でダウンロードした秘密鍵を利用してOCI上のVMにSSH接続してみます。
秘密鍵のパーミッションを以下コマンドで変更します。
※秘密鍵の名称は「oci-private.key」にリネームしています。
``` shell:zsh
$ chmod 400 oci-private.key
```
次に、VMにデフォルトで用意されているopcユーザでSSH接続を試みます。
※一部の情報を「*」で伏せています
``` shell:zsh
$ ssh opc@138.***.***.*** -i oci-private.key 
The authenticity of host '138.***.***.*** (138.***.***.***)' cant be established.
ED25519 key fingerprint is SHA256:******************************************.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '138.***.***.***' (ED25519) to the list of known hosts.
Activate the web console with: systemctl enable --now cockpit.socket

[opc@oci-sample ~]$ 
```
無事に接続できました。

# SSHパスワード認証接続用ユーザ作成
あとは他のLinuxディストリビューションと大体同じ感じです。
まずはrootユーザに切り替えて、パスワード認証接続用のユーザを作ります。
下記例では「develop」ユーザを作成しています。
``` shell:sh
[opc@oci-sample ~]$ sudo su -
[root@oci-sample ~]# useradd develop
[root@oci-sample ~]# passwd develop
Changing password for user develop.
New password: 
Retype new password: 
passwd: all authentication tokens updated successfully.
```

次にdevelopユーザで接続する際にパスワード認証を許容するようsshdの設定を変更します。
```shell:sh
[root@oci-sample ~]# vi /etc/ssh/sshd_config
```
設定ファイルの **末尾** に下記記載を追加してファイルを保存します。
```text:vi
# developユーザのPasswordAuthenticationをOverride
Match User develop
    PasswordAuthentication yes
```
:::note
sshd_configの"Match"が有効となる範囲は「次の"Match"キーワードが出現するまで」なので、原則ファイルの途中に記述しないようにしましょう。
:::
上記設定を保存したら、sshdを再起動。
```shell:sh
[root@oci-sample ~]# /sbin/service sshd restart
```
:::note warn
コマンド実行後、次のようなエラーメッセージが出力されないことを必ず確認しましょう。エラーを無視したままセッションを切断すると、リモートからは再度SSH接続できなくなります。（それでもOCIのWeb画面からなら接続できる模様）
＜例＞
Job for sshd.service failed because the control process exited with error code.
See "systemctl status sshd.service" and "journalctl -xe" for details.
:::

下記コマンドにてdevelopユーザでSSH接続を試みます。
```shell:zsh
$ ssh develop@138.***.***.***            
develop@138.***.***.***s password: 
Activate the web console with: systemctl enable --now cockpit.socket
[develop@oci-sample ~]$ 
```
developユーザで鍵なしでも接続できました。

# 宣伝
冒頭でも少し触れましたが、株式会社エム・イー・シーではOracle Cloudの導入サービスを提供しています。
クラウド化でお悩みやご相談などございましたら、下記弊社サイトから是非ご連絡ください。

https://mec-jp.com/cloud/


[^1]:コンテナベースのPaaS。GitとPostgreSQLを備え、JavaやPHP、Pythonなどの言語で開発したWebアプリをすぐにデプロイ・公開できるサービス。
https://jp.heroku.com