Corredor

ウェブ、プログラミングの勉強メモ。

CentOS7 を日本語環境にする

GCP に登録して GCE をイジり始めた。CentOS 7 イメージを利用して VM を立ててみたのだが、デフォルトでは英語環境になっているので、いくつか日本語環境としての変更を入れてみる。

タイムゾーンを UTC から JST に変更する

まずはタイムゾーンの変更から。変更前は次のような見え方。

$ date
Sat May 25 12:40:37 UTC 2019

$ timedatectl status
      Local time: Sat 2019-05-25 12:43:28 UTC
  Universal time: Sat 2019-05-25 12:43:28 UTC
        RTC time: Sat 2019-05-25 12:43:28
       Time zone: UTC (UTC, +0000)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: n/a

タイムゾーンを JST に変更するには、次のコマンドを叩く。

# タイムゾーンを変更する
$ sudo timedatectl set-timezone Asia/Tokyo

コレで、先程のコマンドの実行結果は次のように変わる。

$ date
Sat May 25 21:43:55 JST 2019

$ timedatectl status
      Local time: Sat 2019-05-25 21:43:46 JST
  Universal time: Sat 2019-05-25 12:43:46 UTC
        RTC time: Sat 2019-05-25 12:43:46
       Time zone: Asia/Tokyo (JST, +0900)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: n/a

標準出力の日本語表示化

コマンドの実行結果を一部日本語化する。

# 以下のコマンドで /etc/locale.conf ファイルを書き換える
$ sudo localectl set-locale LANG=ja_JP.UTF-8

# 書き換えたファイルを再読込するか、マシンをリブートするなどして変更を反映する
$ source /etc/locale.conf

# 表記が日本語に変わった
$ date
2019525日 土曜日 21:50:24 JST

基本は /etc/locale.conf ファイルで指定されている LANGja_JP.UTF-8 に変更すれば良いだけなのだが、~/.bash_profileexport LANG=ja_JP.UTF-8 と書け、と言っている文献がよく見られる。結局は同じことなので指定しても影響はないが、自分が試した限りでは別に export LANG 指定をしなくても日本語表示に切り替わった。

man ページを日本語化する

前述の手順で LANGja_JP.UTF-8 担っていると、一部のコマンドは man ページが日本語表示になるが、より多くのコマンドの man ページを日本語化するには、以下のコマンドを実行する。

$ sudo yum -y install man-pages-ja

以上

今回紹介した内容は、以前 Vagrant の環境構築の中でも一部触れていたのだが、「Linux 環境の日本語化」という観点だけで単独の記事にしたことがなかったので、調べ直して書いた。

neos21.hatenablog.com

↑この記事から2年以上経って、仮想化技術もどんどん進歩していることを実感…。

標準テキスト CentOS 7 構築・運用・管理パーフェクトガイド

標準テキスト CentOS 7 構築・運用・管理パーフェクトガイド

  • 作者: 有限会社ナレッジデザイン大竹龍史,市来秀男,山本道子,山崎佳子
  • 出版社/メーカー: SBクリエイティブ
  • 発売日: 2017/03/22
  • メディア: 単行本
  • この商品を含むブログを見る

実践!  CentOS 7 サーバー徹底構築 改訂第二版 CentOS 7(1708)対応

実践! CentOS 7 サーバー徹底構築 改訂第二版 CentOS 7(1708)対応

永久無料枠で Google Compute Engine (GCE) インスタンスを立ち上げる : その2

前回、Google Cloud Platform (GCP) に登録し、その中の Google Compute Engine (GCE) というサービスを使い、完全無料で使える仮想マシン (VM) を立ち上げて SSH 接続までこぎつけた。

今回は、立ち上げた VM をより安全に利用するための設定を紹介する。

課金を通知する予算アラートを設定しておく

前回説明したとおり、GCP には無料枠と1年間の無料クレジットがあるし、有料アカウントに手動で移行するまでは課金されない。しかし、万が一のことを考えて、1円でも課金対象が発生したらメール通知が飛ぶよう、アラートを設定しておこう。

左上のハンバーガーメニューを開き、「お支払い」→「予算とアラート」と進み、「予算を作成」ボタンを押下する。

f:id:neos21:20190603220607p:plain

ココで、「予算額」を「\ 1 (1円)」と設定する。予算アラートは 50%・90%・100% いずれも「1円」に設定しておく。

f:id:neos21:20190603220603p:plain

f:id:neos21:20190603220558p:plain

f:id:neos21:20190603220552p:plain

コレで、万が一不意に課金されても、メール通知が飛ぶので、すぐに気付いて対処できるだろう。

VM に割り当てられる Public IP を固定する

VM に割り当てられるデフォルトのパブリック IP は、VM を終了するごとに変動してしまう。コレを、VM を終了しても同じパブリック IP が割り当てられるように設定する。

GCP の管理コンソールより GCE の管理画面に移動したら、当該 VM の編集画面を開き、「ネットワークインターフェス」セクションに移動する。

ココで「外部 IP」のセレクトボックスから「IP アドレスを作成」を選ぶと、静的 IP アドレスを予約でき、それを割り当てられる。

f:id:neos21:20190603222502p:plain

それまでの変動 Public IP (エフェメラル IP) は破棄されているはずだが、余計な課金対象として残らないように、「外部 IP アドレス」画面に未使用の IP が残っていないか確認しておこう。

SSH 接続するためのポートを22番から他のポート番号に変更する

実は、VM を作成すると、その直後から GCP を狙った不正アクセスが世界中から仕掛けられている。VM 内の /var/log/auth.log ファイルを見ると、その形跡が確認できるだろう。

コレは、22番ポートが開いている Public IP を総当たりで調べてきていることによるもの。そこで、GCP のファイアウォール設定を利用して、22番ポートへのアクセス自体を禁止し、SSH 接続する際のポート番号を他のモノに変更してセキュアにしておこう。

ポートを変更する前に SELinux を無効化する

独自のポート番号を使用するためには、SELinux の設定を無効化しておく必要がある。まずは普通に22番ポートで SSH 接続し、以下の設定を行う。

# ファイアウォールを無効化する
$ sudo systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.

# 以下のファイルを編集し SELinux を無効化する
$ sudo vi /etc/selinux/config
# 'SELINUX=enforcing' の行を 'SELINUX=disabled' と変更する

# 設定を確認する
$ sudo systemctl is-enabled firewalld
disabled

$ sudo getenforce
Enforcing

ココで、getenforce コマンドの結果が Disabled ではないことが確認できる。まだ先程の設定変更が反映されていないのだ。変更を反映するには、GCP 管理コンソールより、対象のインスタンスを再起動する必要がある。

インスタンスを再起動した後、再度 SSH 接続してみよう。getenforce コマンドの結果が Disabled になっているはずだ。

$ sudo getenforce
Disabled

SSH 接続に使用するポート番号を変更する

続いて、SSH 接続に使用するポート番号を22番から他の番号に変更する。一般的な1024番未満のポートでなければどの番号でも構わないが、今回は例として10022番ポートを使うことにした。

# ポート番号を変更する
$ sudo vi /etc/ssh/sshd_config
# '#Port 22' のコメント行をアンコメントし 'Port 10022' と変更する

# sshd を再起動する
$ sudo systemctl restart sshd

# 設定を確認・10022ポートをリッスンしていることが分かる
$ systemctl status sshd.service
● sshd.service - OpenSSH server daemon
   Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
   Active: active (running) since Sat 2019-05-25 12:22:54 UTC; 1min 2s ago
     Docs: man:sshd(8)
           man:sshd_config(5)
 Main PID: 2883 (sshd)
   CGroup: /system.slice/sshd.service
           └─2883 /usr/sbin/sshd -D

May 25 12:22:54 gce systemd[1]: Starting OpenSSH server daemon...
May 25 12:22:54 gce sshd[2883]: Server listening on 0.0.0.0 port 10022.
May 25 12:22:54 gce sshd[2883]: Server listening on :: port 10022.
May 25 12:22:54 gce systemd[1]: Started OpenSSH server daemon.

このあと、GCP のファイアウォール設定を変更するのだが、設定変更が完了するまでは、このターミナルの接続を切断せずに置いておいた方が良い。万が一設定が間違っていた時に、二度と SSH 接続できなくなる恐れがあるためだ。

(といっても、22番ポートを塞ぐと接続中の SSH 接続も切断されてしまうようなのだが、とりあえず気休めで)

GCP のファイアウォール設定を変更する

GCP の管理コンソールを開き、「10022番ポートへのアクセスを許可」するルールと、「22番ポートへのアクセスを禁止」するルールをそれぞれ作成する。

「ネットワーキング」→「ファイアウォールルール」と開くと、22番ポートでの SSH 接続を許可しているルールがあるはずだ。

f:id:neos21:20190603223314p:plain

まずはコレを流用して、10022番ポートへのアクセス許可用ルールに変更しよう。

  • ルール名 : allow-10022 と変更する (命名はデフォルトルールに沿ったモノ)
  • トラフィックの方角 : 上り
  • 一致したときのアクション : 許可
  • ターゲット : 「指定されたターゲットタグ」を選択する
  • ターゲットタグ : allow10022-server と入力する (命名はデフォルトルールに沿ったモノ・このタグが付いている VM にのみ、このファイアウォールルールが適用される)
  • ソース IP の種類 : 0.0.0.0/0 (全ての IP からのアクセスを許可する)
  • プロトコルとポート : 「指定したプロトコルとポート」を選択し、tcp:10022 と入力する
    • ココで、tcp:22,10022 と入力すると、22番ポートでも10022番ポートでも SSH 接続できる状態になる。一度このような設定で SSH 接続確認しても良いかも

f:id:neos21:20190603223303p:plain

以上のように設定することで、10022番ポートでの SSH 接続を許可するルールができた。

続いて「22番ポートへの接続を許可しないためのルールを作る。新たなルールを作り、以下のように設定する。

  • ルール名 : disallow-22
  • トラフィックの方角 : 上り
  • 一致したときのアクション : 拒否
  • ターゲット : 「指定されたターゲットタグ」を選択する
  • ターゲットタグ : disallow22-server
  • ソース IP の種類 : 0.0.0.0/0
  • プロトコルとポート : 「指定したプロトコルとポート」を選択し、tcp:22 と入力する

f:id:neos21:20190603223252p:plain

2つのファイアウォールルールを作った状態。

f:id:neos21:20190603223246p:plain

そしたら、GCE インスタンスの編集画面に移動する。

編集画面の中に「ネットワークタグ」を指定できる欄があるので、ココに、先程作ったファイアウォールルールの「ターゲットタグ」である、

  • allow10022-server
  • disallow22-server

の2つを入力する。

f:id:neos21:20190603223239p:plain

コレでファイアウォールルール自体の定義と、それを VM に適用するための設定ができた。

変更後のポート番号で SSH 接続する

恐らくこの設定中に、22番ポートで接続中のターミナルの接続は遮断されてしまうと思うが、VM 側の設定がうまく行っていない場合はこのターミナルで引き続き作業したいので、このターミナルウィンドウは触れずに置いておく。

別のターミナルウィンドウを開き、変更後のポート番号を指定して SSH 接続してみる。

# ポート番号を指定して SSH 接続する
$ ssh -i ~/.ssh/my_gce_vm -p 【ポート番号】 【VM 名】@【Public IP】

# 10022番ポートに変更した場合の例
$ ssh -i ~/.ssh/my_gce_vm -p 10022 neosvm@38.154.10.0

コレで接続できれば、allow-10022 というファイアウォールルールが正常に働いていることが分かる。

ついでに、また別ターミナルを開いて、-p 10022 部分を削るか -p 22 と書き直し、22番ポートで SSH 接続してみよう。恐らくどれだけ待っても応答がなく、タイムアウトになると思われる。コレが、disallow-22 というファイアウォールルールが効いている証拠となる。

以上

コレで GCP の登録と、永久無料枠の GCE を使った VM インスタンスの環境構築が出来上がった。後はこの VM で自前の Web サーバを立ててみてもよし、別のインスタンスへの踏み台サーバとしてもよし。無料枠の中でも色々な使い方ができると思うので、お遊び用に作っておくと良いだろう。

プログラマのためのGoogle Cloud Platform入門 サービスの全体像からクラウドネイティブアプリケーション構築まで

プログラマのためのGoogle Cloud Platform入門 サービスの全体像からクラウドネイティブアプリケーション構築まで

Google Compute Engine入門

Google Compute Engine入門

永久無料枠で Google Compute Engine (GCE) インスタンスを立ち上げる : その1

どういうワケか、Heroku で PaaS を触ったあと、Oracle Cloud Infrastructure (OCI) で IaaS 入門してしまった。せっかくなので Google Cloud Platform (GCP) も始めてみよう、と思い、GCP の中の「Google Compute Engine (GCE)」という仮想マシン (VM) を借りられるサービスを使ってみることにした。OCI でいうところの「Compute Instance」を借りるのと同じ領域だ。

ただ、GCE の凄いところは、低スペックな VM を1台だけなら完全無料で借りられる、というところだ。いわゆる「永久無料枠」というヤツなので、お金をかけずにお試しするにはもってこいだ。

今回は、GCP の初回登録から、GCE のインスタンス作成、そしてとりあえず SSH 接続するところまでを試してみる。

GCP の無料枠について

GCP の無料枠については、GCE 以外にもいくつかのサービスがある。詳しくは以下より。

GCP に登録すると、登録から1年間だけ使える、300ドル分のクレジットが無料でもらえる。つまり最初の1年間のうちは、300ドル分の有料サービスを使っても課金されない、ということだ。

また、この300ドルを超過したり、1年を超えて無料トライアル期間が終了しても、動かしていたサービスが止められるだけで、いきなり課金されることはない。最初にクレジットカード情報を登録するものの、手動で有料アカウントに設定しない限りは課金されないので安心だ。

GCE の Always Free (永久無料枠) について

GCP の中の、VM を借りられる GCE については、以下の条件下であればずっと無料で使える。

  1. f1-micro インスタンスが1台だけ借りられる
    • インスタンスは北バージニア (us-east4) 以外の米国リージョンで借りる必要がある。日本リージョンなどで借りると有料になってしまうので注意
    • 米国リージョンなので、通信のレイテンシがある他、f1-micro というインスタンス種別は一番スペックが低い VM なので、スペックには期待できない
  2. 30GB 分の HDD まで
    • f1-micro インスタンスにアタッチできる記憶媒体は、30GB 分までの HDD のみ。それ以上の HDD を指定すると有料になる
  3. 北米から全リージョン宛の下りネットワーク通信が1ヶ月あたり 1GB まで。中国とオーストラリアへの通信は最初から有料
    • VM から外にアクセスするネットワーク通信は、月に 1GB までが無料。大量にファイルをダウンロードするような通信をすると、通信部分が課金されるということだ

というワケで、VM を起動させっぱなしでも課金はされないが、アウトバウンド通信が多いと課金されるし、マシンスペックや HDD のサイズが必要な場合は無料枠では厳しいということになる。

Google Cloud Platform に登録する

それではいよいよ GCP を始めよう。

まずは GCP に登録する。以下のページが無料枠の紹介ページも兼ねているので、ココで無料枠の内容を確認してから、「登録を開始」ボタンで登録していこう。

自分は Google AdSense を利用していて、クレジットカード情報を登録してあるアカウントがあったので、それを利用して GCP に登録することにした。

f:id:neos21:20190603221457p:plain

GCE インスタンスを作成する

GCP に登録できたら、VM を作っていこう。GCP 管理コンソール画面左上のハンバーガーメニューから「Compute Engine」→「VM インスタンス」を選択する。

f:id:neos21:20190603221250p:plain

初回は1・2分待たされるが、「作成」ボタンを押下して次に進む。

f:id:neos21:20190603221248p:plain

「インスタンスの作成」画面に移動したら、次のように設定していく。

  • 名前:半角英数字で任意。コレが VM のユーザ名になる
  • リージョン:US リージョンを選ぶこと。日本から近いのは us-west-1 など、西海岸のリージョン
  • ゾーン:選択した US リージョン内でお好きに
  • マシンタイプ:micro (コレが f1-micro インスタンスのこと)
  • イメージ:OS を選べる。デフォルトは Debian だと思うが、CentOS なども使える
    • ココでプリセット以外のイメージを選ぶと課金されてしまうので注意。Debian か CentOS のどちらかぐらいにしておこう
  • ブートディスク:上限の 30GB に設定しておく
  • ファイアウォール:チェックボックスにより 80 (HTTP) ポートや 443 (HTTPS) ポートを簡単に開放できるが、今は開放しないでおく

f:id:neos21:20190603221244p:plain

f:id:neos21:20190603221242p:plain

f:id:neos21:20190603221240p:plain

設定した内容で本当に課金されないか確認するには、右ペインの費用計算を見てみれば良い。問題なければインスタンスを作成する。

作成が完了したら、VM の一覧でパブリック IP (= 外部 IP) が確認できるようになるはずなので、コレを控えておく。

f:id:neos21:20190603221341p:plain

この Public IP はインスタンスの終了ごとに変わってしまうもので、設定次第で固定 Public IP にもできるので、次回紹介する。今回はこの変動 Public IP をメモしておこう。

SSH 鍵ペアを作成する

VM が作れたら、SSH 接続するための鍵ペアを作成する。

Windows GitBash や MacOS 標準ターミナルなどを開き、以下のようにコマンドを入力する。

$ ssh-keygen -t rsa -b 4096 -f ~/.ssh/my_gce_vm -N '' -C '【VM 作成時に入力した「名前」】'

VM 作成時に「名前」欄に入力した文字列を、-C (コメント) オプションに書くのが特徴。GCE の場合は、この -C オプションによるコメントが任意のコメントではなく、ユーザ名を特定するために使われているようなのだ。

コレで、~/.ssh/ 配下に、my_gce_vm (秘密鍵) と my_gce_vm.pub (公開鍵) の2ファイルが生成されるはずだ。次の手順で使うので、公開鍵ファイルの中身をコピーしておく。

$ cat ~/.ssh/my_gce_vm.pub

# 以下のような文字列が表示されるはずなので全部コピーしておく
ssh-rsa xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 【VM 名】

SSH 公開鍵を VM に設定する

GCP 管理コンソールで、作成した VM インスタンスを選び、編集画面に移動する。

「SSH 認証鍵」セクションに移動すると、SSH キーを入力できるテキストエリアが表示される。ココに、先程確認した公開鍵ファイル (my_gce_vm.pub) の内容を全量貼り付けて保存する。

f:id:neos21:20190603221758p:plain

SSH 接続する

公開鍵設定が終わったので、いよいよ VM にアクセスしてみる。

以下の要領で SSH 接続できるはずだ。

# 秘密鍵ファイルを指定する
$ ssh -i ~/.ssh/my_gce_vm 【VM 名】@【Public IP】

# VM の名前が「neosvm」、パブリック IP が「38.154.10.0」だったとしたら、こんな風になる
$ ssh -i ~/.ssh/my_gce_vm neosvm@38.154.10.0

VM 名のユーザで SSH 接続できただろうか。このユーザは $ sudo su - で root 権限を利用できるので、VM 内でほとんど好きなようにできる。

セキュリティ上やっておきたいことは次回

ココまでで、GCP に登録し、永久無料枠の GCE インスタンスを立て、そこに SSH 接続できた。

しかし、このままでは、セキュリティ上の問題や、使い勝手の悪い部分がある。例えば以下のような点だ。

  • 万が一課金が発生した時に気が付きにくい
  • SSH 接続用に22番ポートが開いており、侵入の危険性がある
  • Public IP が VM の終了に応じて変動してしまう

それぞれ、「予算アラートを設定する」「22番ポートを閉じて別のポートで SSH 接続できるようにする」「固定 Public IP を割り当てる」といった作業で対処できるので、次回の記事も合わせて確認し、安全に利用できるよう設定をしてほしい。

今日のところはココまで。

GCPの教科書

GCPの教科書

  • 作者: クラウドエース株式会社吉積礼敏・他
  • 出版社/メーカー: リックテレコム
  • 発売日: 2019/04/19
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログを見る

Google Cloud Platform エンタープライズ設計ガイド

Google Cloud Platform エンタープライズ設計ガイド

SSH 鍵ペア・API 鍵ペアの作り方おさらい

ある VM に SSH 接続する時に使う鍵ペアとか、API Key として認証に使用する鍵ペアの作り方をおさらいする。それぞれは何らかの記事で紹介したことがあると思うが、コマンド単体で紹介したことがなかったので。

SSH 鍵ペアの作り方

$ ssh-keygen -t rsa -b 4096 -N '【パスフレーズ】' -C '【コメント】' -f "${HOME}/PATH/TO/id_rsa"

Generating public/private rsa key pair.
Your identification has been saved in /Users/Neo/PATH/TO/id_rsa.
Your public key has been saved in /Users/Neo/PATH/TO/id_rsa.pub.
The key fingerprint is:
SHA256:pUXKnmb9pR2P5nhJOLGoz3L5ugsCsXW8+HN+phOM8tQ test
The key's randomart image is:
+---[RSA 4096]----+
|          .      |
|       o o       |
|    . . = o      |
|     + + B  .    |
|    o . S+.. +o  |
|     ..+o E.++.+ |
|      .++..ooo+..|
|       .+*+ o+o  |
|         +OXo..  |
+----[SHA256]-----+
  • -b 4096 と指定したとおり、4096 bit で作成した
  • -N '' とすると、パスフレーズなしの秘密鍵ファイルが生成できる
  • -f でファイルの出力先を指定。${HOME}/PATH/TO/id_rsa (秘密鍵) と ${HOME}/PATH/TO/id_rsa.pub (公開鍵) の2ファイルが生成される
  • 各オプションを記述しないと、対話式プロンプトの中で入力していくことになる

生成できたファイルの内容サンプルは以下。

  • id_rsa (秘密鍵)
-----BEGIN OPENSSH PRIVATE KEY-----
……中略……
-----END OPENSSH PRIVATE KEY-----
  • id_rsa.pub (公開鍵)
ssh-rsa ……中略…… コメント

API 鍵ペアの作り方

いわゆる RSA 鍵のことだ。

# 秘密鍵ファイルを作成する
$ openssl genrsa -out "${HOME}/PATH/TO/key-private.pem" 4096

Generating RSA private key, 4096 bit long modulus
..........++
....................................................++
e is 65537 (0x10001)

# 秘密鍵ファイルから公開鍵ファイルを作成する
$ openssl rsa -pubout -in "${HOME}/PATH/TO/key-private.pem" -out "${HOME}/PATH/TO/key-public.pem"

writing RSA key

# オマケ : 秘密鍵ファイルから「フィンガープリント」を出力する
$ openssl rsa -pubout -outform DER -in "${HOME}/PATH/TO/key-private.pem" | openssl md5 -c

writing RSA key
13:e4:93:84:7d:85:73:fe:c9:be:0b:de:79:9f:2f:92

生成できたファイルの内容サンプルは以下。

  • key-private.pem (RSA 秘密鍵)
-----BEGIN RSA PRIVATE KEY-----
……中略……
-----END RSA PRIVATE KEY-----
  • key-public.pem (RSA 公開鍵)
-----BEGIN PUBLIC KEY-----
……中略……
-----END PUBLIC KEY-----

以上。

OpenSSH[実践]入門 Software Design plus

OpenSSH[実践]入門 Software Design plus

実用SSH 第2版―セキュアシェル徹底活用ガイド

実用SSH 第2版―セキュアシェル徹底活用ガイド

  • 作者: Daniel J. Barrett,Richard E. Silverman,Robert G. Byrnes,小島肇,坂井順行,鹿田幸治,園田道夫,高橋基信,根津研介,宮本久仁男
  • 出版社/メーカー: オライリー・ジャパン
  • 発売日: 2006/11/22
  • メディア: 大型本
  • 購入: 2人 クリック: 79回
  • この商品を含むブログ (48件) を見る

OpenSSL―暗号・PKI・SSL/TLSライブラリの詳細―

OpenSSL―暗号・PKI・SSL/TLSライブラリの詳細―