WSL2で動かすUbuntu18.04でsshサーバーを動かす

WSL2でUbuntuをインストールしたままではsshサーバーを動かせません。

sshd -t」で確認すると下記の結果となります。

***@***-wsl:~$ sshd -t
Could not load host key: /etc/ssh/ssh_host_rsa_key
Could not load host key: /etc/ssh/ssh_host_ecdsa_key
Could not load host key: /etc/ssh/ssh_host_ed25519_key

 

まず「sudo ssh-keygen -A」を実行します。

***@***-wsl:~$ sudo ssh-keygen -A
ssh-keygen: generating new host keys: RSA DSA EAAAA ED99999

 

「/etc/ssh」の下にkeyファイルが作られました。

f:id:fsms:20201017190243p:plain

 

sshサーバーを起動します。

***@***-wsl:~$ sudo systemctl start sshd

 ※systemctlを実行するためにはsystemdがPID1で動いてる必要があります。

fsms.hatenablog.com

 

sshサーバーに接続するための鍵をUbuntu上で作成します。

***@***-wsl:~$ ssh-keygen -t rsa -b 4096

 /home/ユーザー名/.ssh/の下に秘密鍵「id_rsa」、公開鍵「id_rsa.pub」が作成されます。

-rw------- 1 *** *** 3243 Oct 17 19:12 id_rsa
-rw-r--r-- 1 *** *** 753 Oct 17 19:12 id_rsa.pub

 Windowsホスト側からWSL2のUbuntussh接続出来るように「authorized_keys」に公開鍵を設定します。

id_rsa.pubの中身をauthorized_keysにコピーします。

***@***-wsl:~$ cd ~/.ssh
***@***-wsl:~$ cat id_rsa.pub > authorized_keys

 

秘密鍵Windows側のローカルディスクに保存します。

「cat id_rsa」を実行して秘密鍵の中身をコンソールに出力します。

「-----BEGIN RSA PRIVATE KEY-----」から最後の「-----END RSA PRIVATE KEY-----」をマウスで選択してコピー、ローカルディスク上にファイル名を何でもいいのですが「ubuntu.pem」を作成してそのファイルにペーストします。

***@***-wsl:~$ cat id_rsa
-----BEGIN RSA PRIVATE KEY-----
******************************************
~~~~~~~~~~~~~~~~~~~~~~~~~******************************************
-----END RSA PRIVATE KEY-----


 

これで慣れ親しんだTera TermでWSL2のUbuntussh接続出来ます(笑)。

f:id:fsms:20201018063028p:plain

 

WSL2で動くUbuntu18.04でsystemdを有効にする

WSL2でUbuntuインストール直後はPIDの「1」がMSカスタムの「init」に割り当てられています。

そのため「systemctl」による制御がエラーになります。

「systemctl」を有効にするためには「systemd」をPID1で動かす必要があります。

Ubuntuのバージョンは18.04です。

 

■systemctlでエラーとなる

***@***:~$ sudo systemctl status sshd
System has not been booted with systemd as init system (PID 1). Can't operate.

 

そのためには「genie」を使います。

github.com

 

https://github.com/arkane-systems/genie

このページの「INSTALLATION」に従ってインストールします。

 

1.daemonize, dbus, policykit-1, systemdのインストール

       それぞれ「apt install」を実行します。

 

2.dotnet-runtime-3.1のインストール

        MSの下記ページの「18.04」の章に従ってdotnetをインストールします。

docs.microsoft.com

 

3./etc/apt/sources.list.d/wsl-translinux.listの作成

***@***:~$ sudo vi /etc/apt/sources.list.d/wsl-translinux.list

 

wsl-translinux.listに下記設定

deb [trusted=yes] https://wsl-translinux.arkane-systems.net/apt/ /

 

インストール

***@***:~$ sudo apt update
***@***:~$ sudo apt install -y systemd-genie

 

インストール出来たら「genie -c bash」を実行してsystemdをPID1で動かす。

「ps aux」と叩いて確認。

f:id:fsms:20201017184257p:plain

 

「systemctl」が有効になりました。

f:id:fsms:20201017184435p:plain

 

 

Ubuntu起動時に「genie -c bash」を起動してsshサーバーを起動するように「~/.bashrc」に下記追記します。

if [ "`ps -eo pid,cmd | grep systemd | grep -v grep | sort -n -k 1 | awk 'NR==1 { print $1 }'`" != "1" ]; then
genie -c bash
sudo systemctl start sshd
fi

 

 下記参考

snowsystem.net

 

WSL2で動くUbuntuでDNSをGoogleのパブリックDNSに変更する。resolv.confの設定

WSL2で動くUbuntuDNSGoogleのパブリックDNSサービスに変更します。

WSL2でUbuntuインストール直後の/etc/resolv.confを見ると下記のようにホスト側のWindowsマシンのIPアドレスがnameserverとして設定されてます。

***@***:~$ cat /etc/resolv.conf
# This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry to /etc/wsl.conf:
# [network]
# generateResolvConf = false
nameserver 172.24.192.1

 

Windows側のIPアドレスは⚙ →「ネットワークとインターネット」の中のネットワーク接続「vEthernet (WSL)」で確認出来ます。

f:id:fsms:20201017112538p:plain

 


/etc/resolv.conf は /run/resolvconf/resolv.conf へのシンボリックリンクになっているので、まずシンボリックリンクを削除します。

***@***:~$ ls -l /etc/resolv.conf
lrwxrwxrwx 1 root root 29 Oct 17 12:03 /etc/resolv.conf -> ../run/resolvconf/resolv.conf
***@***:~$ sudo rm /etc/resolv.conf

 

削除したら新規に/etc/resolv.confを作成します。

resolv.confにはnameserverとしてGoogleのパブリックDNSサービスのIPアドレス8.8.8.8を設定します。

***@***:~$ sudo vi /etc/resolv.conf
nameserver 8.8.8.8

 

このままだとUbuntuを再起動した場合に/etc/resolv.confが自動的に作成されて上書きされてしまいます。

「/etc/wsl.conf」を新規に作成して上書きされないように設定をします。

 ***@***:~$ sudo vi /etc/wsl.conf

 

 「generateResolvConf = false」を設定。

[network]
generateResolvConf = false

 

 Windows側でUbuntuを再起動してもresolv.confは上書きされずにGoogleのパブリックDNSサービスの8.8.8.8が残っています。

C:\>wsl -t Ubuntu-20.04

 

 

俺コイン(仮想通貨=暗号資産)を作ってみた

オリジナルの仮想通貨(暗号資産※)を作ってみました。

その名は「Tokyo Coin(TKYcoin)」。

2019年5月に金融商品取引法の改正法が成立して暗号資産へと呼称が変わりました。

github.com

 

Tokyo Coinは下記サイトを参考にLitecoinのソースをforkして作りました。

作る過程は改めて記事にしたいと思います。

www.hackster.io

AzureでWebアプリケーションを動かす環境を作ってみよう

 

 

1.初めに

AzureでWebアプリケーションを動かす環境を作ってみます。

AzureはMicrosoftクラウドサービスですが、Windowsサーバーの環境だけではなくIaaS(Infrastructure as a Service)でLinuxのサーバーも立てることが出来ます。

 

azure.microsoft.com

 

 今回作る構成の概要は以下の通りです。

  1. Webサーバー2台、OSはLinux、CentOS7
  2. HTTPリクエストはLoad Balancerが受けてWebサーバーに振り分け
  3. DBはAzure Database for MySQL ←これはPaaS(Platform as a Service)
  4. メンテナンスサーバー(踏み台サーバー)をたててWebサーバー、DBへのアクセスはここ経由にする
  5. グローバルIPアドレスはLoad Balancerとメンテナンスサーバーが持つ
  6. VNETは1つ、Webサーバー、メンテナンスサーバーでサブネットを分ける

ではstep by stepで作ってみましょう。

 

構成図

f:id:fsms:20200906151129p:plain

 

2.リソースグループの作成

まずはリソースグループを作成します。

Azureではサブスクリプション単位で課金額が集計されますが、そのサブスクリプションの下にリソースグループがぶら下がります。

プロジェクト毎にリソースグループを作るイメージですね。

今回は「lemon」というプロジェクト名を想定してリソースグループを作ってみます。

 

f:id:fsms:20200531133321p:plain

 

f:id:fsms:20200531165657p:plain

 


リソースグループ名「rg-lemon」を入力、リージョンは「東日本」を選択します。

リソース命名規則はMSの資料を参考にしてみてください。

docs.microsoft.com

 

次にタグですが、

 

f:id:fsms:20200531165028p:plain

「project=lemon」、「environment=production」と2個のタグをつけました。

これで作成します。

 f:id:fsms:20200531175056p:plain

 

リソースグループ「rg-lemon」が作成されました。

「NetworkWatcherRG」というリソースグループも作成されています。これは自動で作成されるものでこのままで大丈夫です。

 

3.ネットワークの作成

 Webサーバーやメンテナンスサーバーを配置するネットワークを作成します。

 新規作成から「仮想ネットワーク」を選択します。

f:id:fsms:20200531170235p:plain

 

 

f:id:fsms:20200531170914p:plain

 仮想ネットワーク名に「vnet-lemon」を入力します。地域は「東日本」。

次にサブネットを作成します。

 

f:id:fsms:20200906151258p:plain

下記2個のサブネットを作成しました。

  • subnet-manage     -> 10.1.0.0/24
  • subnet-public        -> 10.1.10.0/24

sunet-publicにWebサーバー、sunet-mangeにメンテナンスサーバー(踏み台サーバー)を置く予定です。

タグには作成済みの「project=lemon」、「environment=production」を選択して、追加で「resource=vnet」を入れました。

これでVNETを作成します。

 

f:id:fsms:20200830163718p:plain

 

 

 

4.メンテナンスサーバー(踏み台サーバー)の作成

まず、各サーバーへアクセスするためのメンテナンスサーバー(踏み台サーバー)を作成します。

f:id:fsms:20200906151459p:plain


 

新規作成画面で”centos”を検索します。

f:id:fsms:20200531180405p:plain



CentOS-based 7.5」を選択して作成します。

f:id:fsms:20200830173435p:plain

 

 

仮想マシンを作成していきます。

f:id:fsms:20200830175704p:plain

仮想マシン名は「vm-ope-prod」、 ユーザー名には「lemon」と入力しました。

 

f:id:fsms:20200830175836p:plain

 

サブネットは「subnet-manage」、パブリック IPはデフォルトのままです。

受信ポートはSSH(22)を選択しておきます。

Virtual Machineを作成します。

 

f:id:fsms:20200830174720p:plain

「秘密キーのダウンロードとリソースの作成」をクリックしてサーバーの作成とSSHログインのための秘密鍵のダウンロードを行います。

 

作成出来たら「vm-ope-prod」の概要にアクセスしてパブリック IP アドレスを確認します。

f:id:fsms:20200830180405p:plain

 

Tera TermなどのSSHクライアントでログインしてみましょう。

ダウンロードした秘密鍵を使います。

f:id:fsms:20200903213643p:plain

 

ログイン出来たらSSHのポートを変えておきましょう。

/etc/ssh/sshd_confでポートを変更します。

今回は「54321」としました。

 

変更したらsshdをrestartします。

f:id:fsms:20200831033823p:plain

 

Azureの管理画面でネットワークの受信ポートの規則でSSHの宛先ポート範囲を「54321」に変更しましょう。

f:id:fsms:20200831033956p:plain

 

ポート54321でSSHログインして下記コマンドでTimezoneとLocaleを変更します。

    sudo localectl set-locale LANG=ja_JP.utf8

    sudo timedatectl set-timezone Asia/Tokyo

変更したらrebootします。

 

5.Webサーバーの作成

Webサーバーを作成します。

 

メンテナンスサーバーと同様CentOSで作成します。

 

f:id:fsms:20200906053946p:plain


リソースグループ「rg-lemon」、仮想マシン名「vm-we01-prod」、可用性オプションに「可用性セット」を選択して「avail-lemong-wewb-prod」と入力、あとはデフォルトのままです。

 

SSHの情報を入力します。

f:id:fsms:20200831041302p:plain

まず、「SSH 公開キーのソース」には ”既存の公開キーを使用” を選択します。

メンテナンスサーバーからSSHログイン出来るようにするため、メンテナンスサーバーのユーザー「lemon」の公開キーが必要です。

公開キー取得のため「PuTTYgen」をインストールして起動します。

起動したらLoadボタンでメンテナンスサーバーの「vm-ope-prod_key.pem」をLoadします。選択画面でpemファイルが表示されるようにファイル名でAll files(*.*)を選択してください。

f:id:fsms:20200903212846p:plain


メンテナンスサーバー作成時にダウンロード済みの「vm-ope-prod_key.pem」を選択します。

f:id:fsms:20200906152909p:plain



Importされました。OKを押して進みます。

 

 

Public key for pasting into OpenSSH authorized_keys file: の中の公開鍵をコピーします。

f:id:fsms:20200905163551p:plain

 

SSH 公開キー欄に貼り付けます。

SSHログインユーザー(OSアカウント)名は「lemon」。

f:id:fsms:20200906055131p:plain


 

 「次: ディスク」に移ります。

 

f:id:fsms:20200830170414p:plain

Premium SSDのまま「次: ネットワーク」に移ります。

 

f:id:fsms:20200903040250p:plain

Webサーバーなのでサブネットには「subnet-public」を選択します。

Webサーバーは直接インターネット側からアクセス出来ないようにするため、パブリック IPには「なし」を選択します。構成図のようにインターネットからのリクエストはロードバランサが受けてWebサーバーに振り分けます。WebサーバーにSSHログイン出来るのは踏み台サーバー経由に制限されます。

受信ポートを選択ではHTTP(80)、HTTPS(443)を選択し、SSH(22)は外します。

 残りはデフォルトのままです。Virtual Machineを作成しましょう。

 

vm-web01-prodが出来たら、メンテナンスサーバーからvm-web01-prodにsshログイン出来るようにします。

先ほどのPuTTYgenでConversions → Export OpenSSH key をクリックします。

f:id:fsms:20200906153821p:plain


 

ファイル名は「id_rsa」として保存します。

f:id:fsms:20200906153737p:plain




次にWinSCPでメンテナンスサーバーにアクセスしてみましょう。

メンテナンスサーバーのIPアドレス、ポート番号を指定します。

f:id:fsms:20200903042958p:plain

 

「設定」をクリックしてダウンロード済みの「vm-ope-prrod_key.pem」を選択します。pemファイルを選択出来るように「すべてのファイル(*.*)」を選択します。

f:id:fsms:20200903043753p:plain


 

 OKで進みます。

f:id:fsms:20200903044141p:plain

 

ファイル名「vm-ope-prod_key.ppk」として保存します。

f:id:fsms:20200903044349p:plain

このppkファイルを使ってWinSCPでメンテナンスサーバーにアクセスします。

アクセスしたら/home/lemon/.sshに先ほどのid_rsaファイルを転送します。

f:id:fsms:20200903054451p:plain

 

「id_rsa」ファイルを転送したらメンテナンスサーバーにsshログインします。

ログインしたら「/home/lemon/.ssh」に移動してid_rsaファイルのパーミッションを変更します。

「chmod 600 id_rsa」でOwnerだけがRead Write出来るパーミッションに変更します。

f:id:fsms:20200903054713p:plain

 

vm-web01-prodサーバーにvm-ope-prodからsshログインしてみます。

f:id:fsms:20200904052743p:plain

パスワード無しでsshログイン出来ました。

もう1つのWebサーバー「vm-we02-prod」も同じように作ってください。

可用性オプションでは「vm-we01-prod」と同じ可用性セット「avail-lemon-web-prod」を選択してください。

 

6.Load Balancer(ロードバランサ)の作成

Azureには「Application Gateway」というWAF(Web Application Firewall)機能付きのロードバランサのサービスもありますが、価格が高いので今回は単純にリクエストをバックエンドに振り分けるだけのLoad Balancerを作ります。

Load Balancerを作る前にvm-web0(1|2)-prodにWebサーバーをインストールしましょう。今回はNginxを使います。

まず、yumでインストールされているパッケージを最新にします。

[lemon@vm-web01-prod ~]$ sudo yum -y update

 

ファイル /etc/yum.repos.d/nginx.repo を新規に作成してnginxの設定を追加します。

[lemon@vm-web01-prod ~]$ sudo vi /etc/yum.repos.d/nginx.repo

 

この内容を貼り付ける。

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

 

インストールします。

[lemon@vm-web01-prod ~]$ sudo yum -y install nginx

 

起動します。

[lemon@vm-web01-prod ~]$ sudo systemctl start nginx

 

 wgetで確認します。

    [lemon@vm-web01-prod ~]$ wget localhost
--2020-09-06 03:36:51--  http://localhost/
localhost (localhost) をDNSに問いあわせています... ::1, 127.0.0.1
localhost (localhost)|::1|:80 に接続しています... 失敗しました: 接続を拒否されました.
localhost (localhost)|127.0.0.1|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 612 [text/html]
`index.html' に保存中

100%[==========================================================================================================================================>] 612         --.-K/s 時間 0s

2020-09-06 03:36:51 (102 MB/s) - `index.html' へ保存完了 [612/612]

 

ではLoad Balancerを作成しましょう。

f:id:fsms:20200906040333p:plain

  

 名前は「rg-lemon-prod」、パブリックIP名は「pip-lemon-prod」、割り当ては「静的」としました。

f:id:fsms:20200906041715p:plain

 

LBがリクエストを振り分ける先のバックエンドプールを追加します。

f:id:fsms:20200906041927p:plain

 

仮想ネットワークに「vnet-lemon」を選択して仮想マシンを追加します。

f:id:fsms:20200906052023p:plain

 

f:id:fsms:20200906052204p:plain


正常性プローブを追加します。

f:id:fsms:20200906060700p:plain

 

負荷分散規則を追加します。

f:id:fsms:20200906070630p:plain


それではLoad Balancerに割り当てられたパブリックIPアドレスにブラウザでアクセスしてみましょう。

Nginxのデフォルトページが表示されたら成功です。

 

7.データベースの作成

PaaSのAzure Database for MySQLを作成します。

f:id:fsms:20200906071138p:plain

  

f:id:fsms:20200906085847p:plain

vCoreとストレージは必要な数を選んでください。

管理者ユーザー名とPWを入れて作成します。

f:id:fsms:20200906090316p:plain


メンテナンスサーバーにMySQLのクライアントを入れてみましょう。

 

(参考先)

[MySQL][5.7]MySQL クライアントをインストールする

 

下記サイトからrpmをDownloadしてインストールします。

dev.mysql.com

 

wgetリポジトリセットアップパッケージをDownload

[lemon@vm-ope-prod ~]$ wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm

 

リポジトリのインストール

[lemon@vm-ope-prod ~]$ sudo yum localinstall ./mysql80-community-release-el7-3.noarch.rpm

 

MySQL8.0の無効化とMySQL5.7の有効化

[lemon@vm-ope-prod ~]$ sudo yum-config-manager --disable mysql80-community
[lemon@vm-ope-prod ~]$ sudo yum-config-manager --enable mysql57-community

 

バージョン5.7が有効になっていることを確認

[lemon@vm-ope-prod ~]$ yum repolist all | grep mysql
mysql-cluster-7.5-community/x86_64 MySQL Cluster 7.5 Community 無効
mysql-cluster-7.5-community-source MySQL Cluster 7.5 Community - S 無効
mysql-cluster-7.6-community/x86_64 MySQL Cluster 7.6 Community 無効
mysql-cluster-7.6-community-source MySQL Cluster 7.6 Community - S 無効
mysql-cluster-8.0-community/x86_64 MySQL Cluster 8.0 Community 無効
mysql-cluster-8.0-community-source MySQL Cluster 8.0 Community - S 無効
mysql-connectors-community/x86_64 MySQL Connectors Community 有効: 165
mysql-connectors-community-source MySQL Connectors Community - So 無効
mysql-tools-community/x86_64 MySQL Tools Community 有効: 115
mysql-tools-community-source MySQL Tools Community - Source 無効
mysql-tools-preview/x86_64 MySQL Tools Preview 無効
mysql-tools-preview-source MySQL Tools Preview - Source 無効
mysql55-community/x86_64 MySQL 5.5 Community Server 無効
mysql55-community-source MySQL 5.5 Community Server - So 無効
mysql56-community/x86_64 MySQL 5.6 Community Server 無効
mysql56-community-source MySQL 5.6 Community Server - So 無効
mysql57-community/x86_64 MySQL 5.7 Community Server 有効: 444
mysql57-community-source MySQL 5.7 Community Server - So 無効
mysql80-community/x86_64 MySQL 8.0 Community Server 無効
mysql80-community-source MySQL 8.0 Community Server - So 無効

 

 MySQLのクライアントをインストール

[lemon@vm-ope-prod ~]$ sudo yum -y install mysql-community-client

 

MySQLに接続するために接続のセキュリティでメンテナンスサーバーのグローバルIPアドレスを接続許可に追加します。

SSL接続は無効にします。

f:id:fsms:20200906143156p:plain


サーバー名とサーバー管理者ログイン名を使ってMySQLに接続します。

f:id:fsms:20200906144229p:plain

 

WebサーバーからWebアプリケーションがMySQLに接続するには、メンテナンスサーバー同様にWebサーバーのグローバルIPアドレス(GIP)を許可許可設定してください。

GIPは下記curlコマンドで分かります。

[lemon@vm-ope-prod ~]$ curl globalip.me

 Load Balancerに割り当てられたGIPが表示表示されると思います。

 

これで完成です。

あとはこの環境の上にWebアプリケーションを構築出来ますね。