未分類

概要

マニュアル解説シリーズです。今回のお題はこちら。

PostgreSQL: Documentation: 12: 20.1. The pg_hba.conf File

認証について

はじめに

PostgreSQLサービスを使うには、まず

  • サーバーにアクセスできること(ネットワーク的に到達できること)
  • サーバーに接続できること(サービスが稼働していて、ポートなどが開いていること)
  • サービスがクライアントを認証し、PostgreSQLのユーザーとマッピングできること

が必要です。3つ目の項目がココで説明する内容です。最初の2つに問題がある場合は、ここで説明する以前の話になります。

※細かく言うと、他にOSが何らかのセキュリティ(SELinux/AppArmorなど)で弾くケースがありますが、今回は考慮しません。

クライアント認証とはサーバー側から見て、接続してきたモノがどこの誰かを識別することです。この人に違いないと思ったらユーザーとマッピングされますが、そうでない場合はエラーで弾かれるということです。

PostgreSQLの認証の種類

認証方法説明
trust認証接続できただけで特定のユーザーとして認証する
パスワード認証指定されたユーザーであることをパスワードで確認して認証する
GSSAPI認証ActiveDirectoryなどで使用されるKerberos認証で認証されたユーザーとして認証する。
GSSAPIはそこで使用されるAPIで、所謂シングルサインオン。
SSPI認証Windows認証で認証されたユーザーとして認証する(Kerberos含む)。
サーバー/クライアントともにWindowsのときだけ使用できる、所謂シングルサインオン。
IDENT認証identサーバーでクライアントが実行中のユーザーを取得して認証する。
大昔に利用されてたサーバーで現在は使われない
Peer認証ローカル接続のときだけ、クライアントの実行ユーザーを取得して認証する。Windowsでは使用できない。
OSのユーザー名とPostgreSQLのユーザー名が一致する必要がある
LDAP認証LDAPのデータを使って指定されたユーザーであることを確認して認証する。中身はパスワード認証と同じ。
RADIUS認証RADIUSのデータを使って指定されたユーザーであることを確認して認証する。中身はパスワード認証と同じ。
平文ではないものの通信が暗号化されない
証明書認証SSLで受け取ったクライアント証明書のCommon Nameで認証する。
PAM認証LinuxのPAMのデータを使って指定されたユーザーであることを確認して認証する。中身はパスワード認証と同じ。
BSD認証OpenBSDで使える認証方式。よく知らない。

かなり方式が多いので注意です。ただ、よく使用されるのは太字の3つ。他はセキュリティに難があったり、ユーザーの管理がPostgreSQL内のユーザーとのマッピング維持が大変だったりして、あまり使用されません。証明書認証は通信経路そのものが暗号化されており、今後利用の増加が見込まれるという意味での太字です。

Ubuntu18.04のデフォルト設定

Ubuntu18.04のpg_hba.confのデフォルト設定はこんな感じ。

# database superuser can access the database using some other method.
# Noninteractive access to all databases is required during automatic
# maintenance (custom daily cronjobs, replication, and similar tasks).
#
# Database administrative login by Unix domain socket
local   all             postgres                                peer

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
host    all             all             ::1/128                 md5
# Allow replication connections from localhost, by a user with the
# replication privilege.
local   replication     all                                     peer
host    replication     all             127.0.0.1/32            md5
host    replication     all             ::1/128                 md5

# で始まる行はコメントです。それ以外の行は、どんなIPから、どういう接続で誰がどのデータベースに接続しようとしていた場合、どういう認証方式を使用するかを表しています。あとは1行ずつ見ていきます。

local   all             postgres                                peer

これは

  • local=ローカル接続=Unixドメインソケットの接続
  • all=対象データベースは何でもいい
  • postgres=ユーザーがpostgres(管理者)

という条件を全て満たす場合、peer=Peer認証するという設定です。そういえば最初にpostgresユーザーでpsqlで繋いだときパスワード聞かれませんでしたよね。そのときはココの設定が効いていたということです。

local   all             all                                     peer

次の行は先程のユーザー設定列がall、誰でもいいになっただけです。つまり、ローカル接続ならどのデータベースでも誰でもPeer認証にする、という設定です。一般ユーザーを作った後、そのユーザーでpsqlを実行したときにパスワード聞かれませんでしたよね。そのときに使われた設定です。

host    all             all             127.0.0.1/32            md5

次の行はhostなので、ローカル接続ではないTCP/IPの接続であることを意味しています。データベースとユーザーはallなので何でもOKです。次のIPアドレスっぽいのが、クライアントのIPです。127.0.0.1はローカルホストを意味する特別なIPで、つまりTCP/IPで同じホストから繋いできたときは、誰でもどんなデータベースでも、md5=パスワード認証を行う、という意味になります。ただし、同じホストならローカル接続でPeer認証できるので、普通はこの設定を使うことはありません。

ただし、Peer認証はLinux上のユーザー名と一致しないと使えないので、Linuxのユーザー名と異なるユーザー名をPostgreSQL側に作成した場合には使用されます。

host    all             all             ::1/128                 md5

次の行はさっきの設定のIPv6版です。説明は省略します。

残りの行はレプリケーション用の接続設定なので、1つしかない今回は割愛します。

つまりどういう設定か…

ローカルホストからしか使えない設定になっています。
なので別のマシンから接続する場合は、認証設定を追加する必要があります。

ローカルホスト以外からのパスワード認証の追加

特定のIPv4ホストからの接続でパスワード認証を追加する

host    all             all             10.0.2.2/32            md5

こんな感じで、10.0.2.2(VirtualBoxのNATの仮想ルーターのIP)からTCP/IPで接続された場合、パスワード認証をかけることが出来ます。

特定のIPv4 LAN内の複数ホストからの接続でパスワード認証を追加する

host    all             all             192.168.0.0/24            md5

こんな感じで、192.168.0.1~192.168.0.254までのIPからTCP/IPで接続された場合、パスワード認証をかけることが出来ます。

設定ファイルを編集したら…

OSに用意された方法でサービスの再起動をしてください。

ローカルホスト以外からのSSLクライアント認証の追加

hostssl all all all cert map=cnmap

こんな感じで追加出来ます。SSLで接続する場合は、他のTCP/IP接続手段は消した方がいいでしょう。
cnmapというのは、Common Nameとユーザーをどうマッピングするかという設定を他のファイルに記述するのですが、そこで使用されるマッピングの名前です。

具体例を↓に書いたので、良かったら参考にしてください。あまり丁寧には書いてないですけど…。

まとめ

PostgreSQLの認証設定は種類が多く、デフォルトではローカルからの認証設定しか存在しない。
今回はそこにリモート接続からの認証設定を追加する方法を解説した。

未分類

概要

VirtualBoxのネットワークについて、簡単に解説します。
内容的にはマニュアルの↓の部分です。原文をChrome翻訳などで読める方はそちらの方が正確です。

Chapter 6. Virtual Networking

仮想ネットワックのモードについて

VirtualBoxで構成可能な仮想ネットワークにはいくつかのモードがあり、それぞれ構成や可能なことが異なります。

この画面で割り当ててるやつのことです。アダプターは4つあるので組みあせて使用することも可能です。

モード説明
NAT(デフォルト)いつもお世話になっているモードです。
VM→ホスト/インターネットが可能で、ホスト→VMはポートフォワードしないと出来ません。VM間の通信は出来ません。
NATネットワークVM間の通信も可能なNATです。
ブリッジホストと同じネットワークに参加します。
内部ネットワークVM間だけで通信できます。
ホストオンリーVMとホストが双方向に通信できるモードです。ただしVMはインターネットにはアクセス出来ません。
汎用ドライバ使ったことがないので、説明しません。拡張パックのドライバを使用して、トンネルを作るのに使うようです。

NAT(デフォルト)

デフォルトで簡単そうに見え、Oracleも簡単と言ってますが、ソフト的には実は一番ややこしいモードです。

解説

模式的に書くと以下な感じ。

各VMごとにNATを構成する仮想ルーターがあり、ホストのWindowsはどのIPも10.0.2.2で、ゲスト(VM)はどのIPも10.0.2.15(DHCP)となっています。VMのOSが起動しIPを自動取得すると、仮想ルーターのDHCPで10.0.2.15が返るということです。仮想ルーターはホスト側にIPを持っておらず、従ってVM間の通信はできない、ということになります。ようするにIPが同じか振られていないかで VMの区別が付かないということです。

NATとは…

家庭用のルーターなどで使用されているネットワークの仕組みです。

ネットワークアドレス変換 – Wikipedia

正式にはNAPT、古くはIPマスカレードと呼ばれていた機能の系譜になります。ざっくり説明すると、上図のVMから来たパケットをさもホストから送られたパケットとして外部のネットワークに転送し、返事としてホスト宛に返ってきたパケットを上手いこと識別して(ココが難しい)元のVMに転送する機能です。IP通信はTCP/UDPなどのプロトコルがあり、NAPTは各プロトコルに合わせてIPやポートを上手いこと変換するので、IPマスカレードと呼ばれていました。仕組みについては、

NAPTとは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

辺りを読んで分かった気になってください。ココ以上に上手い説明を私は知りません。
IPやポートを変換できないものは弾かれるため、自動的にファイヤーウォールが構築されることになります。

ポートフォワーディングについて

IPやポートを変換できないものに関して、固定の例外的ルールを作ることで、ファイヤーウォールに穴を開けることが出来ます。例えば、sshの標準ポートである22で、通信開始(SYN)のパケットが外から送られてきた場合は、弾かずにVMのIP 10.0.2.15のポート22に転送する、などのルールです。パケットを転送することをフォワードと呼ぶので、これをポートフォワードと呼びます。

ポートフォワーディングの設定がない場合、NATのファイヤーウォールを越えることは出来ません。

NATネットワーク

これを模式的に書くとこんな感じ。

ただのNATよりは幾分スッキリした構成になり、1つの仮想ルーターでVM同士が並び、DHCPで綺麗にIPが振られているのが分かります。これなら物理LAN同様VM同士が通信出来るのも分かります。VMとホストの関係はNATのときと変わらないので、同じように扱う事ができます。

ブリッジ

これを模式的に書くとこんな感じ。

VMがホストと同じネットワークに参加する形になります。VMが普通に1台のPCとしてネットワークに出現してきます。ある意味一番ユーザーには分かりやすい形です。ただしDHCPな環境であれば、1台でホスト+VMの数分IPを使うので管理者泣かせの形ですし、VMにもホストと同等のセキュリティが求められます。

内部ネットワーク

これを模式的に書くとこんな感じ。

VM同士は繋がっていますが、ホストとVMは繋がっていません。DHCPサーバなどもいないので、通常静的IPを使って独自のネットワークを構築します。VirtualBoxの機能を使ってDHCPの機能を追加することも頑張れば出来ます。物理ネットワークに出る手段がない形なので、主に外部からの影響を受けたくないときに一時的に使用するマニアックな構成だと思います。

ホストオンリー

これを模式的に書くとこんな感じ。

内部ネットワークにホストが参加しました!という構成です。ついでにホストにIPを振るための仮想ネットワークアダプタを用意し、DHCPも提供されています。 VMを外のネットワークと遮断した上でホストとは通信できますが、内部ネットワーク同様、個人的にはマニアックな設定に見えます。さすがにホストとは通信したいだろうという配慮なんでしょうかね…

なお、たまにNAT+ホストオンリーなネットワーク構成をオススメしてるサイトも見たことがありますが、ホストとVMを仮想ルーターでも繋げて仮想ブリッジでも繋げるというのは変則的なので、個人的には、素直にNATにポートフォワードの設定をオススメしたいです。

まとめ

VirtualBoxのネットワーク設定の種類について説明し、いつもデフォルトで使っているNATがどんな特性のものなのかを解説しました。
SVGのお絵描き大変ですが、面白かったです。inkscapeありがとう!

未分類

事件

今日何気なく記事を編集して、「ああ、そういや過去記事で似たような画像作ったな…作った画像どこだっけ?」って過去記事を探していたところ、どこを探しても見つかりません。

この画像には alt 属性が指定されておらず、ファイル名は image-27-1024x188.png です

あれれ?それもそのはず消えているのです。そう言えばアップロードしたときも↓な感じでメッセージが出てました。

プレビューとかでは見えていたので、「警告かなぁ…まあいいや」と気にしていなかったのですが、実際にアップロードには失敗していた模様。そしてこのファイルこそがsvgだったのです。

なぜ拒否られてたのか?

アップロードできるファイル・タイプがWordPress側で決められているからです。

Uploading Files « WordPress Codex

これはメッセージに出ていたようにセキュリティ上の理由です。

どうすればいいのか?

メッセージから調べたところ、対応方法の記事が以下に見つかりました。

https://www.elegantthemes.com/blog/wordpress/how-to-fix-the-sorry-this-file-type-is-not-permitted-for-security-reasons-error-in-wordpress

大きく分けて、プラグインを使う方法とそうでない方法があるようです。遅くなりそうだからプラグインを使いたくなくて、

3. Use the Upload_Mimes Filter by Editing Your Theme’s functions.php File

の方法にしようと考えました。テーマのファイルをいじるようですが、テーマと言えばLuxeritas、誰かやってないかなぁとググって↓の記事を見つけました。

https://it-blue-collar-dairy.com/svg-upload/

ピッタリですね。読んで見ると、今までインストールはしたものの、面倒だったので使ってこなかった「子テーマ」を使うのがいいようです。

子テーマの適用

よく分からないけどポチっと変えてみたら、、、

『設定が共通化されてない!』

直後からカスタマイズした設定の全てがデフォルトに戻っています。親テーマに戻すと戻るのですが、子テーマに変えるとまたデフォルトに…。どうやら設定が共通化されてないようなのです。ここを分ける意味はあったんでしょうか…。どこかに相互にコピーする機能があるのかもしれませんが、まあいうてそんな変えてないので、ポチポチ再設定して復元しました。凝った設定をしてる方、お気をつけください

functions.phpの編集

どうやら子テーマとは、親テーマを直接いじることなく、テーマのphpファイルを書き換えるなどヘビーな操作をWebから行えるようにした、カスタマイズの申し子のようです。どおりでアップデートの頻度が少ないわけです。↓な感じでサクっと編集できます!

でも、これ書き間違えたら二度と直せないような…要るのかな?…この画面…

ちなみに修正は↓のみ。参考文書ではいろいろ他にも処理していましたが、本家のコードにないことはしたくなかったので…

function my_custom_mime_types( $mimes ) {
	$mimes['svg'] = 'image/svg+xml';
	$mimes['svgz'] = 'image/svg+xml';
	return $mimes;
}
add_filter( 'upload_mimes', 'my_custom_mime_types' );

無事アップロード出来たので問題なし、です。ちなみに↓が投稿した記事内のsvg画像のレスポンスヘッダ。

HTTP/1.1 200 OK
Date: Tue, 04 Feb 2020 22:21:33 GMT
Server: Apache
Last-Modified: Tue, 04 Feb 2020 22:16:33 GMT
ETag: "a3c0204-10b0b-59dc7647855c6"
Accept-Ranges: bytes
Content-Length: 68363
Vary: User-Agent
Connection: close
Content-Type: image/svg+xml

普通に返されてるので、少なくとも私のアップロード操作で、別のファイルタイプと勘違いしているような問題は起きてないように見えます。

未分類

前書き

前回はWindows上のVirtualBoxで入れたUbuntuにPostgreSQLをインストールし、簡単なテーブルを作成・表示させてみました。

今回はそのテーブルをWindowsから見てみようという記事です。

Ubuntu側の設定

PostgreSQLの設定

前回はUbuntu上のpsqlコマンドから同じマシン上のPostgreSQLサーバーに接続してSQLを叩いていました。現在のPostgreSQLの設定はこのタイプの接続しか許可していません。別のマシン上のアクセスを許可する設定をしていきます。

この設定は設定ファイルに書かれているので、ターミナル/sshで接続したコマンドプロンプトから、viコマンドを使ってファイルを編集する必要があります。ただ、viはとても癖のあるエディタで機能も少ないので、それを改良したvimを先にインストールします。操作感は同じですが、ハイライトされるなどの機能が違います。

$ sudo apt install -y vim

インストールが終わると、同じviコマンドでも、動きが変わってきます。ではまず、/etc/postgresql/10/main/pg_hba.confを編集して、別のマシンからの接続設定を追加します。

$ sudo vi /etc/postgresql/10/main/pg_hba.conf

viの操作方法(最小限)

キー操作意味
上に移動
下に移動
左に移動
右に移動
i入力モードに入り、以降[ESC]で戻るまで打ち込んだ文字を挿入します。
xカーソル位置の文字を削除します。
dd1行削除します。
[ESC]入力モードから戻ります。
ZZファイルを保存して終了します。
:q!ファイルを保存しないで終了します。

上を参考にどうにかして、ファイル末尾付近に移動して「ココ追加」の1行を追加してみてください。vimでググるとよりいろいろな操作方法を知る事ができますが、覚えることが多いので今は最小限でいいです。

# database superuser can access the database using some other method.
# Noninteractive access to all databases is required during automatic
# maintenance (custom daily cronjobs, replication, and similar tasks).
#
# Database administrative login by Unix domain socket
local   all             postgres                                peer

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
# ↓ココ追加
host    all             all             10.0.2.2/32             md5
# ↑ココ追加
# IPv6 local connections:
host    all             all             ::1/128                 md5
# Allow replication connections from localhost, by a user with the
# replication privilege.
local   replication     all                                     peer
host    replication     all             127.0.0.1/32            md5
host    replication     all             ::1/128                 md5
"/etc/postgresql/10/main/pg_hba.conf" 102L, 4790C             90,10        末尾

追加したのは、「(ホストから転送されてきた)ホスト自身からの接続の場合、パスワードで認証する」という設定です。10.0.2.2はVirtualBoxがホストに割り当てている仮想ネットワーク上のアドレスです。編集しているpg_hba.confファイルのフォーマットについての詳細は、

20.1. pg_hba.confファイル (PostgreSQLのマニュアル)

を御覧ください。よく分からないと思いますが、丁寧に説明しているとそれぞれ1つの記事になってしまうので、今回は割愛します。

参考: VirtualBoxのネットワークについて

参考: pg_hba.confファイルの認証設定

次にpostgresql.confを編集し、TCP/IPで待ち受ける(listenする)IPアドレスを追加します(デフォルトではTCP/IPで待ち受けていない=IPアドレスでの接続を待ち受けていない)。

$ sudo vi /etc/postgresql/10/main/postgresql.conf

ここでも「ココ追加」と書かれている1行を、どうにかして追加してください。

# CONNECTIONS AND AUTHENTICATION
#------------------------------------------------------------------------------

# - Connection Settings -

#listen_addresses = 'localhost'         # what IP address(es) to listen on;
                                        # comma-separated list of addresses;
                                        # defaults to 'localhost'; use '*' for all
# ↓ここ追加
listen_addresses = '*'                  # what IP address(es) to listen on;
# ↑ここ追加
                                        # (change requires restart)
port = 5432                             # (change requires restart)
max_connections = 100                   # (change requires restart)
#superuser_reserved_connections = 3     # (change requires restart)
unix_socket_directories = '/var/run/postgresql' # comma-separated list of directories
                                        # (change requires restart)
#unix_socket_group = ''                 # (change requires restart)
#unix_socket_permissions = 0777         # begin with 0 to use octal notation
                                        # (change requires restart)
#bonjour = off                          # advertise server via Bonjour
<c/postgresql/10/main/postgresql.conf" 664L, 23154C           64,15-10       8%

完了すると、Ubuntuが持っているネットワークI/F全てで、ポート5432の接続待ちをする設定が追加されます。後はPostgreSQLサービスを再起動して新しい設定を読み込ませるだけです。

$ sudo service postgresql restart

VirtualBoxの設定

sshのときと同様にポートフォワードの設定が必要です。Ubuntuを動かしているVirtualBox上のメニューから、[デバイス]>[ネットワーク]>[ネットワーク設定]を開きます。

[高度]>[ポートフォワーディング]を押します。

上記のようにゲストIPを10.0.2.15でホスト/ゲストポートを5432に設定し、名前を適当につけて[OK]を押します。

すると、ホスト側の5432ポートに来た接続は、ゲスト側のIP10.0.2.15のポート5432に転送されます。この設定がない場合、ファイヤーウォール(NAT)に弾かれて、ホストからゲストにPostgreSQLの標準通信ができません。

Windows側の設定

PostgreSQLクライアントを導入

PostgreSQLクライアントの選定

PostgreSQLの無料クライアントはいくつか種類があります。

最も軽いのはUbuntuで使用したpsql(サーバー同梱)です。これはバッチ実行などをする際にはよく使いますが、コマンドから直に何かしたいとき以外はあまり使いません。

PostgreSQL専用のGUIクライアント兼管理ツールpgadminがあります。これも管理をする際には使いやすいツールです。

今回は、他のDBでも汎用に使用できるGUIのSQLエディタである、DBeaverをご紹介します。これは元々主にJava開発のIDEとして使用されるeclipseのプラグインとして実装されたものです。日本ではこのような種類ではA-5が有名ですが、世界的には現在このDBeaverが無料汎用SQLエディタでNo.1です。

DBeaverのインストール方法

DBeaverのインストールにはいくつか方法があります。

  1. インストーラを使用する
  2. zipを展開してjdkの設定を自分でする
  3. chocolateyを使用してインストールする

今回はchocolateyを使用して、インストールしますが、いずれの方法でも構いません。

Chocolateyとは

以下のリンク先のソフトです。

Chocolatey Software | Chocolatey – The package manager for Windows

Windows用のコマンドラインベースのパッケージ管理ツールに該当します。Ubuntuのaptのような使い勝手のツールです。便利なので、私も可能なときはchocolateyでアプリをインストールしています。便利な点はいくつかありますが、

  • まとめてソフトのアップデートを出来ること
  • インストールしたアプリの一覧をエクスポートし、他のPCにもまとめてインストールすることが出来ること
  • 共通の依存パッケージを複数入れなくて良くなったりすること

くらいでしょうか…

逆にイケてない点は

  • アプリ独自で更新機能を持っているソフトはどっちでアップデートする迷う(DBeaverもそうですが)
  • ユーザーの少ないパッケージは作りが適当で、うまくインストール/アンインストールできない場合がある

辺りです。

Chocolateyのインストール

インストール方法はあらゆるケースを網羅した資料が英語だけど↓にあります。

Chocolatey Software | Installation

私は以下の手順でインストールしています。

  1. Windowsキーを押す
  2. cmdと打ち込んでCtrl+Shift+[Enter]
  3. ユーザーアカウント制御(UAC)の問い合わせに[OK]
  4. 立ち上がった管理者権限のコマンドプロンプトで以下を実行
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command " [System.Net.ServicePointManager]::SecurityProtocol = 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"

終わるとchocolateyが使えるようになります。コマンドラインが不得意な人は、続けてchoco install chocolateyguiでGUI版もインストールできます。

DBeaverのインストール

管理者権限のコマンドプロンプトから

cinst dbeaver -y

するだけでインストールは終了します。

Windowsから接続

DBeaverの起動

初回起動時に出てくるポップアップは全部キャンセルします。一度しか見れないメッセージだと間違えるかもしれないので。

左上の新しい接続ボタンを押します。

PostgreSQLのゾウさんを選択して[次へ]

DatabaseとUserとPasswordを記述して、[テスト接続]

まだドライバがないため、ダウンロードするか聞いてくれるので[ダウンロード]

ダウンロードが完了すると、正しく設定されていれば上のようなテスト接続成功画面が出てきます。
満足して[OK]→[終了]してください。

元の画面に戻ると、データベースナビゲータで選べるデータベースが追加されてます。開いてみてください。

ポチポチ押していくと、前回作成したデータベースやテーブルがグラフィカルに表示されてることが分かります。ここでexample_tableをダブルクリックすると…

何やら分かりやすく整理されてテーブルの定義が表示されています。上部中央のデータタブをクリックすると…

当然のようにExcel表のような画面が表示されています。SQLを覚えてpsqlでコマンド叩かなくてもExcelが使える人なら簡単な編集は出来てしまいます。もちろんSQLも便利に使えるソフトです。でも、これでデータベースも怖くなくなりそうじゃないですか?

まとめ

WindowsのVirtualBox上で動くUbuntuに入れたPostgreSQLサーバーを外部からTCP/IPで接続できるように設定し、WindowsからDBeaverを使ってアクセスできるようになった。

次回は、Ubuntu上でVisual Studio codeをインストールし、pythonの開発環境を整えたいと思います(↓)。

未分類

前回まではVirtualBox上のUbuntu18.04にsshサーバーをインストールして、Windowsからsshで繋げられるところまで実施しました。

今回はUbuntu18.04にHerokuでよく使用されるPostgreSQLをインストールして、SQLなDatabaseを使えるようにします。

インストールの前に

Dockerじゃダメなの?

最近の環境構築では、こういうケースで、便利なのでDockerを使うことも多いです。ただし、それはUbuntuやLinuxに慣れてれば、の話なので、今回はまずは基本のローカルインストールを実施します。

Databaseとはどんなもの?

みんなが使用する大規模データを入れておくサーバーです。ファイルサーバーよりもより細かく、大量のデータを検索したり集計したりできます。検索したり集計したりするのに、データの持ち方や、検索・集計に使用するI/Fや言語などの区別により、いろいろな種類のデータベースがあります。

今回インストールするPostgreSQLは古式ゆかしいSQLを使用するRDBMSという分類のデータベースです。Excelのお化けみたいなタイプで、OracleやMySQLなどと同様古くからある、最もオーソドックスなタイプのデータベースになります。

インストール

$ sudo apt install postgresql

いつもどおり、パスワードを入力して、容量確認して"y"でOKです。2020年2月4日現在PostgreSQLの最新バージョンは12ですが、ここでインストールされるバージョンは10になります。これはUbuntu18.04が約2年前のOSであることが原因です。最新バージョンを入れる方法もありますが、そこまで凝ったこともしないので、今回はバージョン10のまま使います。

初期設定など

素のPostgreSQLはpostgresという管理ユーザーが一人だけいるパスワード設定のない管理用のデータしか入っていないデータベースになっています。

管理ユーザーで接続

まずはsudoで PostgreSQLの管理ユーザー postgres になります。

user@ubuntu1804:~$ sudo -i -u postgres bash --login
[sudo] user のパスワード: 
postgres@ubuntu1804:~$ 

PostgreSQLに接続します。ここではPostgreSQLサーバーに同梱されているpsqlコマンドを使います。

postgres@ubuntu1804:~$ psql
psql (10.10 (Ubuntu 10.10-0ubuntu0.18.04.1))
Type "help" for help.

postgres=# 

この状態でPostgreSQLに接続しています。例えば現在操作しようとしているデータベースの状態を調べるには…

postgres-# \conninfo
You are connected to database "postgres" as user "postgres" via socket in "/var/run/postgresql" at port "5432".
postgres-# \l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------+----------+----------+-------------+-------------+-----------------------
 postgres  | postgres | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | 
 template0 | postgres | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
(3 rows)

postgres-# 

psqlコマンドの内部コマンドである、\coninfoで、現在接続しているデータベースを調べています。"postgres"という名前のデータベースに接続しています。ややこしいのですが、PostgreSQLに限らずデーターベースサーバー内には通常複数のデータベースが格納されていて、それぞれに名前がついています。この"postgres"という名前のデータベースは、管理用のデータが入っているデータベースです。

その次に実行している\l内部コマンドが、現在接続しているPostgreSQLサーバー内のデータベース一覧です。全て管理用のデータベースなので、普通のデータは格納しませんし、これらのデータベースは基本的に直接いじりません。

管理ユーザーのパスワード設定

まずはpostgresユーザーのパスワードを設定します。 (パスワード)部分にはご自分の覚えやすいパスワードを設定してください。

postgres-# alter user postgres with password '(パスワード)'
postgres-# 

一般ユーザーとデータベース作成

このままPostgreSQL内のユーザー追加と、データベース追加を行います。
(ユーザー)(パスワード)(ユーザーデータベース名)には自分で名前を入れてください(ユーザー名はUbuntuのユーザー名と一致させてください)。ここではそれぞれuser, password, userdbで実施しています。

postgres=# create user "(ユーザー)" password '(パスワード)';
CREATE ROLE
postgres=# create database "(ユーザーデータベース名)" owner "(ユーザー)";
CREATE DATABASE
postgres=# \l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------+----------+----------+-------------+-------------+-----------------------
 postgres  | postgres | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | 
 template0 | postgres | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 userdb    | user     | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | 
(4 rows)

postgres=# 

psqlの内部コマンド\lで新しいデータベースuserdbが所有者userで作成されているのが分かります。

なお、今回設定されたパスワード、実は使用しません。ローカル接続のpeer認証を使っているからなのですが、ネットワーク経由で接続する場合に初めて必要になるのですが、今回はネットワーク経由で使用しないということです(SSLクライアント認証などを使用する場合はネットワーク経由でも使いませんけども…)。

これで一旦管理ユーザーでの作業が終わるので、抜けます。psqlからは\qで、sudo bashからはexitで抜けます。

postgres=# \q
postgres@ubuntu1804:~$ exit
ログアウト
user@ubuntu1804:~$ 

一般ユーザーで接続

改めてpsqlコマンドで繋ぎ直します。(ユーザーデータベース名)(ユーザー)には先程作成したものを使用してください。ここではそれぞれuserdb, userとしています。

user@ubuntu1804:~$ psql -d (ユーザーデータベース名) -U (ユーザー)
psql (10.10 (Ubuntu 10.10-0ubuntu0.18.04.1))
Type "help" for help.

userdb=>

テーブル作成とデータ追加

何もしないのも寂しいのでサンプル程度のデータを作成します。以下を貼り付けて実行してください。create tableでExcel表のようなテーブルを作成し、insertでデータをテーブルに挿入しています。英語圏の人なら何をしているかこれだけで分かるような文法です。

create table example_table (item_id varchar(14) primary key, item_name varchar(100), kakaku numeric(10,0));
insert into example_table values('4514603365511','アサヒ 十六茶 PET500ml',124);
insert into example_table values('4514603343519','アサヒ 十六茶 (LL)紙パックスリム250ml',80);
insert into example_table values('4514603377019','アサヒ 十六茶 PET2L',350);
insert into example_table values('4514603240719','アサヒ 十六茶 PET275ml',115);
insert into example_table values('4514603377217','アサヒ 十六茶 PET630ml',140);
insert into example_table values('4514603240818','アサヒ 十六茶 ボトル缶275g',115);
insert into example_table values('4514603241112','アサヒ 十六茶 缶245g',86);
insert into example_table values('4514603386110','アサヒ 十六茶ほうじ茶 PET630ml',140);
commit;

実行するとexample_tableが作成されて、中にアサヒ飲料様の尊いお茶のデータが数件作成されます。元データは↓のホームページからお借りしました。

JANコード一覧|商品情報|アサヒ飲料

では作成したテーブルのデータをselectで見てみましょう。

userdb=> select * from example_table;
    item_id    |               item_name               | kakaku 
---------------+---------------------------------------+--------
 4514603365511 | アサヒ 十六茶 PET500ml                |    124
 4514603343519 | アサヒ 十六茶 (LL)紙パックスリム250ml |     80
 4514603377019 | アサヒ 十六茶 PET2L                   |    350
 4514603240719 | アサヒ 十六茶 PET275ml                |    115
 4514603377217 | アサヒ 十六茶 PET630ml                |    140
 4514603240818 | アサヒ 十六茶 ボトル缶275g            |    115
 4514603241112 | アサヒ 十六茶 缶245g                  |     86
 4514603386110 | アサヒ 十六茶ほうじ茶 PET630ml        |    140
(8 rows)

userdb=>

それっぽいデータが表示されました。十六茶、皆さんも大好きですよね。

まとめ

WindowsのVirtualBox上にインストールしたUbuntu18.04にPostgreSQLをインストールし、簡単なテーブルを作成、表示してみました。

次回はもう一発PostgreSQLをやります。ホスト側から、DBeaverというSQLエディタを使って操作してみます。

未分類

概要

前回Windows上にVirtualBoxでLinux(Ubuntu LTSデスクトップ版)を構築する方法を掲載しました。

構築後は大体こんな感じの画面になっております。

今回は、このLinux上にsshサーバーとPostgreSQLサーバーを入れてみたいと思います。

デスクトップ版なのにサーバーを入れる?

はい。デスクトップ版でもsshサービスやDBサービスを提供することが出来ます。サーバー版とデスクトップ版の違いはやや古いですが、以下のように書かれています。

The first difference is in the CD contents. The “Server" CD avoids including what Ubuntu considers desktop packages (packages like X, Gnome or KDE), but does include server related packages (Apache2, Bind9 and so on). Using a Desktop CD with a minimal installation and installing, for example, apache2 from the network, one can obtain the exact same result that can be obtained by inserting the Server CD and installing apache2 from the CD-ROM.

The Ubuntu Server Edition installation process is slightly different from the Desktop Edition. Since by default Ubuntu Server doesn’t have a GUI, the process is menu driven, very similar to the Alternate CD installation process.

Before 12.04, Ubuntu server installs a server-optimized kernel by default. Since 12.04, there is no difference in kernel between Ubuntu Desktop and Ubuntu Server since linux-image-server is merged into linux-image-generic.

For Ubuntu LTS releases before 12.04, the Ubuntu Desktop Edition only receives 3 years of support. This was increased to 5 years in Ubuntu LTS 12.04 In contrast, all Ubuntu LTS Server Edition releases are supported for 5 years.

https://help.ubuntu.com/community/ServerFaq#What.27s_the_difference_between_desktop_and_server.3F

以下意訳

  • 「サーバー」CDは、Ubuntuがデスクトップパッケージ(X、Gnome、KDEなどのパッケージ)と見なすものは含めませんが、サーバー関連パッケージ(Apache2、Bind9など)を含んでいますデスクトップCDを使用しても、たとえばネットワークからapache2をインストールすると、サーバーCDを挿入し、CD-ROMからapache2をインストールする場合とまったく同じ結果を得ることができます
  • Ubuntu Server Editionのインストールプロセスは、Desktop Editionとは少し異なります。デフォルトではUbuntu ServerにはGUIがないため、プロセスは簡単なメニュー選択によるインストールプロセスになります。
  • 12.04より前のバージョンでは、Ubuntuサーバーはデフォルトでサーバー最適化カーネルをインストールします。 12.04以降、linux-image-serverはlinux-image-genericにマージされるため、Ubuntu DesktopとUbuntu Serverの間でカーネルに違いはありません。
  • 12.04より前のUbuntu LTSリリースでは、Ubuntu Desktop Editionのサポートは3年間のみです。これは、Ubuntu LTS 12.04で5年に延長されました。対照的に、すべてのUbuntu LTS Server Editionリリースは5年間サポートされます。

ようは最初のインストールプロセスと、初期インストールパッケージが違うだけなのです。それらのパッケージは後から手動で追加して同じ状態にすることが可能です。だから、デスクトップ版でもサーバー版と同じサーバー用のソフトをインストール出来ます。

sshサーバーをインストールする

sshとは

Secure SHellの意味で名付けられたプロトコルの名前です。shellというと、Windowsで言えばコマンドプロンプトの裏で動いているcmd.exeとかが該当し、Linuxでも代表的なものはbashとかになるのですが、sshはそれらのshellとはちょっと違います。経緯はここでは書きませんが、httpなどと同じ「プロトコル」で、ネットワークで使うものだと分かってもらえれば結構です。

httpはWebでのアクセスに使うプロトコルということは現代人なら皆知ってます(?)。ではsshは何に使うプロトコルなのでしょう?答えは、ネットワークで繋がった離れたところにあるコンピュータで、bashなどのshellを使うためのプロトコルです。例えば、自宅/学校/会社からVALUE/CORE/X-SERVERなどのレンタルサーバー、或いはconohaなどのVPS上でコマンドを使いたいときに、このsshを使います。

インストール

デスクトップ版なので、GUIアプリを使ったインストールも可能なのですが、ここではUnix系らしくコマンドでインストールしていきます。実のところ Ubuntuデフォルトの GUIパッケージ管理アプリはあまり使いやすくありません。ではまずはデスクトップ上で右クリックしてメニューを開き、「端末を開く」を選択するか、Ctrl+Alt+Tを押して、端末(ターミナル)を起動してください。

これがターミナルです。起動したら、以下のように打ち込むと、sshサーバーのインストールが始まります。

$ sudo apt install openssh-server

実行するとパスワードを聞かれるので、自分のパスワードを入れてください。


ディスク領域をどれくらい使うなどの情報が出た後、インストールしてもいいか聞かれると思うので、そこで「y」とすれば後は待ってるだけで入るはずです。

サービスの停止・起動・再起動・状態問い合わせ

sshサーバーをインストールしたので、ubuntuにsshプロトコルを使ってアクセスできるようになりました。sshサーバーが提供しているのはsshサービスです。このようなサービスはUbuntuが動いてる間はずっと何もしなくてもサービスを提供し続けています。なので管理者の都合で必要なときに起動したり、停止できるようになっています。Ubuntuでは、こういうサービスを管理するためのコマンドが用意されています。

例えば、ターミナルから、以下のように打ってみてください。

$ sudo service sshd status

これはsshdというサービスのstatus(状態)を問い合わせるためのコマンドです。緑色で、active(running)=アクティブ(実行中)と表示されているので、sshdというサービスが稼働中であることが分かります。およそ見当がついていると思いますが、このsshdがsshサーバーです。先程インストールしたサーバーが既に動作中ということです。大抵のサーバーソフトはインストールするだけですぐに起動するので覚えておいてください。なお、このコマンドは「q」を押すことで終了します。

今回はサービスの状態問い合わせをしましたが、一般的には以下の形式が使えて、

$ sudo service サービス名 指示

「指示」に使えるのは、statusの他に、 start(開始)、stop(停止)、restart(再起動)などがあります。が、名前のとおりなので説明は省略します。詳細はman sshdなどで調べてください。そのまま打ち込んだ場合は英語の説明になると思うので、得意じゃない人はググってchromeなどで翻訳した方がいいかもしれません。

ホストからsshで接続する

ホスト?ってなるかもしれませんが、これはWindowsのことです。VirtualBoxのようなソフトでは、メインになってるOSをホストOSと呼び、その中で仮想的に起動しているOSをゲストOSと呼びます。なので、今回はWindowsがホストOSで、UbuntuがゲストOSとなります。つまりWindowsからUbuntuにsshで接続するということです。

ホストからゲストに接続?

仮想化して2つOSが動いてるにしたって、機械は1台だけです。ネットも何もないのに何をどう接続すると言ってるのでしょうか?
答えは、仮想ネットワークです。ネットワークも仮想化しているので、本物のネットワークと同様に接続して通信出来るのです。

画像のように仮想ルーター(NAT)まであって、簡単なファイヤーウォールまで備わっています。ファイヤーウォールがあるということは、つまりゲストOS側からは自由にネットワークにアクセスできますが、ホストOS側からは弾かれるということです。同じPCの中なのに…

ポートフォワードの設定

ファイヤーウォールがあるなら、その外から繋ぐためには、家庭用ルーター同様穴あけが必要になります。このファイヤーウォールを構築しているのは、VirtualBoxなのでまずはそのポートフォワード設定を行います。起動してる仮想マシンのメニューの[デバイス]から[ネットワーク]>[ネットワーク設定]を選択してください。

出てくる画面で、[高度]を開いて、[ポートフォワーディング]のボタンを押します。

ホストポート/ゲストポートをsshが使うポート22に設定し、ゲストIPを10.0.2.15に設定すればOKです。これで、Windowsにsshで繋ぎに来ると、ポートフォワードされてUbuntuのsshサーバーに繋がるようになります。

WindowsからUbuntuにssh接続

Windows 10ならsshコマンドが標準でついているので、そのまま使えます。他のWindowsの場合はsshクライアントを用意してください。まずはコマンドプロンプトを開いて、、、

>ssh ユーザー名@localhost

としてみます(ユーザー名はUbuntuのユーザー名です)。すると、

>ssh ユーザー名@localhost
The authenticity of host 'localhost (127.0.0.1)' can't be established.
ECDSA key fingerprint is SHA256:KM795/aQQ75Vk0ZuE0po/wslaCVMYRKHZ/U3CtZvtfA.
Are you sure you want to continue connecting (yes/no)?

まずはこんなことを聞かれます。sshでは、まずホスト間(この「ホスト」は「コンピュータ」くらいの意味で、「ホスト/ゲスト」の「ホスト」ではありません)の認証をして、その後ユーザーの認証をするのですが、初めて通信するホストの場合、このホストを信用していいかどうかを必ず聞かれます。ここでyesを選択すると、次回以降同一ホストでは聞かれません。ここでは、Ubuntuと通信してるので、Ubuntuを信用していいかどうかを聞かれています。「yes」を押して先に進みます。

>ssh ユーザー名@localhost
The authenticity of host 'localhost (127.0.0.1)' can't be established.
ECDSA key fingerprint is SHA256:KM795/aQQ75Vk0ZuE0po/wslaCVMYRKHZ/U3CtZvtfA.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'localhost' (ECDSA) to the list of known hosts.
ユーザー名@localhost's password:

ここで改めてパスワードが聞かれます。Ubuntuインストール時に設定したパスワードでログインしてください。

>ssh ユーザー名@localhost
The authenticity of host 'localhost (127.0.0.1)' can't be established.
ECDSA key fingerprint is SHA256:KM795/aQQ75Vk0ZuE0po/wslaCVMYRKHZ/U3CtZvtfA.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'localhost' (ECDSA) to the list of known hosts.
ユーザー名@localhost's password:
Welcome to Ubuntu 18.04.4 LTS (GNU/Linux 5.3.0-28-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage


 * Canonical Livepatch is available for installation.
   - Reduce system reboots and improve kernel security. Activate at:
     https://ubuntu.com/livepatch

0 個のパッケージがアップデート可能です。
0 個のアップデートはセキュリティアップデートです。

Your Hardware Enablement Stack (HWE) is supported until April 2023.

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

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

ユーザー名@ubuntu1804:~$

ここまで来ればssh接続成功です。あとはWindows上のコマンドプロンプトから、Ubuntuのターミナルで出来ることは全て実施することが出来ます。

さらなるセキュリティと利便性を求める方へ

sshの目玉は公開鍵認証です。丁寧な解説はありませんが、興味があり、内容的に余力のある方は↓もやってみてください。

まとめ

今回はWindows上にVirtualBoxを使って動かしたUbuntuにsshサーバーをインストールしてWindowsから繋いでみました。

次回は、データベース・サーバーである、PostgreSQLをインストールしてみます。

未分類

顔文字に他意はありません?。単にインパクトを狙っただけの話です?。

?本日2020年2月2日、Luxeritas 3.7.8がリリースされました?。目玉はうるさいくらいに使ってるこの『emoji 』 です?。恐らく以前から文字自体は使えてた?と思いますが、これがブロックエディタに追加され、ポチポチするだけで入れられるようになった?ということだと思います?。

先日ご報告させて頂いた問題にも対策して頂き、追随する必要のあるパッチが減って喜んだ束の間、この「ブロックエディタ」の変更だけは個人的にインパクトが大きく驚愕した次第です?。シンタックスハイライターもブロックエディタの一種なので、ここに入っているのですが、このファイルだけなぜか元々minifyされていて、元のファイルがないため、beautify→手作業で編集→minifyしないといけないのです。minifyしてるとパッチを機械的に当てられなくなるだけでなく、シンボルがワケワカメな名前になったり?、文がコンマ並びの式になったり?、いろいろ 可読性が低下してしまいます?。まあそうそう編集されるファイルではないと思うので、そんな気にしてませんが、できればやりたくないというのが本音です?。

もう二度とこんなにemojiを使う機会はないと思いますが、 3.7.8リリースおめでとうございます?。


追伸

私が仕込んだバグが発見されたそうで、3.7.8.2がリリースされたそうです?
謹んでお詫び申し上げます ?

未分類

別にMacユーザーさようならという記事ではありません。メインターゲットがWindowsユーザーなだけです。

Linuxとは

Unixという古式ゆかしい文化の流れを汲むOSの1つです。仲間にFree/Open/Net-BSDとかSolarisとかいます。そうそう、冒頭で触れたMacが使ってるOSもFreeBSDの流れを汲むOSの1つです。商用のUnixもいくつかあり、MacOS/Solarisとかは商用ですね。詳細は https://ja.wikipedia.org/wiki/Linux参照。

Unix系OSの特徴は…ターミナルだけで何でも出来るように設計されていることです(本当の意味ではPOSIX準拠くらいが妥当だと思う)。我々Windowsユーザーには信じられないですね。簡単に言えばコマンドプロンプト1つだけで何でも出来るというわけですから。当然マウスはオプションです。もちろんWindowsも極めると大抵の人はほとんどマウス使わなくなりますけど…。

ターミナルだけで何でも出来るということは、ネットワーク的に離れたところからでも、sshなどで接続すれば手元のPCと同じように何でも出来るということです。つまりネットワーク越しの作業がしやすい=サーバー向けということになります。サーバーは普通ディスプレイも繋がっておらず、データセンターでラックに積まれるようなPCなのです。これにsshなどで繋いでコマンドラインから操作できるのがUnix系OSです。Windows系のサーバでは、通常そういう操作は行われず、リモートデスクトップのGUI画面を使ってサーバを操作します。一見初心者でも楽に操作できますが、サーバ単体のコストが高いのと、負荷が高いときに(自動で)サーバを増やして対応する(スケールアウト)ようなことが出来ないので、サーバーの主流はUnix系になります。

Windowsから使うLinux

WindowsもLinuxも括りはOSです。OSとは基本電源入れてから(ブートローダ除けば)最初に起動するものなので、普通は何かのOSを使っていたら、他のOSは同時に起動しません。アプリとは違うのですよアプリとは。つまりWindowsを使っていたら、普通は同時にLinuxを使えないのです。

しかし、ゲームをするためにWindowsを使っていたいけど、裏でスクレイピングさせてるからLinuxも同時に使いたいなぁとかいうことはあるわけです。昔はこれを実現するためにはPCが2台必要で、1台にWindowsを入れてゲーム、1台にLinuxを入れてスクレイピングといった使い方をしないといけませんでした。そんなゲーマーのために(?)最近は「仮想化」という単語とともに、1台で複数のOSを同時に動かす技術が生まれています。

仮想化の時代

現代はあらゆる仮想化の技術によって、いろいろな恩恵を受けることができます。OSも例外ではなく、CPU仮想化支援とハイパーバイザーの力を借りて、複数のOSを同時に動かすことが出来ます。

Windows上でLinuxを動かす場合、2020年2月2日現在、以下の方式が一般的です。

  1. Hyper-V(ハイパーバイザ)を無効にしてVirtualBox/VMwareなどを使って好きなディストリビューションのLinuxを動かす
  2. Hyper-V(ハイパーバイザ)を無効にしてWSLを使って対応ディストリビューションのLinuxを動かす(WSL1のまま使う)
  3. Hyper-V(ハイパーバイザ)を有効にしてWindowsもLinuxも使う(WSL2はこの方式)

2.は動かないソフトがあったり、安定性が問題になる場合があります。3.は1.の使い方が出来なくなる問題があります(最近のVirtualBoxは機能的にHyper-V有効でも動くようになったらしいが、ハード依存しており安定していない)。そこで今回は1.のケースを選択します。

なお、1~3いずれにしてもCPU仮想化支援を前提としています。今使われてるCPUは大半がこの機能を持っていると思いますが、BIOSの設定次第の場合があるので、BIOSで有効化しておきましょう。

なお、最近巷でよく聞くDockerなどのコンテナ系の仮想化もありますが、これらはOSそのものを仮想化してるわけではないので、ここでは扱いません。OSそのものの機能はホストのものを使い、アプリの実行環境をコンテナという箱で管理する方式に近いです。ようは1.~3.でLinuxをインストールしないと使えないということです。

VirtualBoxのインストール

現在主流のVMソフトはVirtualBox/VMwareの2つですが、ここでは無料で登録せずに使えるVirtualBoxを選択します。

vagrantで良くない?

いいえ。某学習サイトなどで紹介される、vagrantもローカルインストール用に中で使ってるのはVirtualBoxです。なので、VirtualBoxを意識せずにvagrantで簡単インストールすることも可能です。ただ、vagrantは元々いろいろなPCに同じLinux環境をインストールしたい人が楽に出来るよう開発されたツールです。初心者が何が何だか分からないけど使うような、親切設計の便利ツールではありません。悪いことは言わないので、最初はVirtualBoxを直に使って環境に対する理解を深めることをオススメします。そうでないと問題が起きたときの対応が全く取れなくなります。慣れてからvagrantの恩恵に預かってください。便利さに心打たれます。

ダウンロード

Downloads – Oracle VM VirtualBox

ここから最新をダウンロードします。

インストール

ダウンロードしたインストーラをポチポチするだけでOKです(途中ドライバのインストールで署名関連の警告が出るが気にせずOKでいい)。難しいことはありません。

→PC内に仮想PCをもう一台起動することが出来るようになった

Linuxのインストール

VirtualBoxのおかげで、PC内に仮想PCをもう一台起動することが出来るようになりました。しかし、この仮想PCにも設定とOSのインストールという作業が必要になります。普通PCを買うとOSはプリインストールされた状態で納品されますが、元々素のPCにはOSなど入っていないのです。そこで、まずは仮想PCの作成とLinuxのインストールをします。

ディストリビューションの選定

Linuxのインストールをする前にディストリビューションを決めます。Linuxと一口に言っても、実はその種類であるディストリビューションが星の数ほどあるからです。しかし主要なディストリビューションを2つ挙げるとすると、Redhat(CentOS)とUbuntuです。日本で業務用に使う場合はRedhat(CentOS)が多いですが、個人用で使いやすいディストリビューションはUbuntuになります。オススメは個人用に扱いやすいUbuntuでLinuxに慣れるです。Redhatは仕事で必要になったらCentOSで勉強する、くらいでいいと思います。なので、ここでの選択もUbuntuです。

ダウンロード

Ubuntuを入手する | Ubuntu | Ubuntu

デスクトップ版かつサポート期間の長いLTS版をダウンロードします。本当はサーバー版の方が適切なのですが、GUIが全く使えないので、慣れてる人以外はデスクトップの方が扱いやすいです。サーバー版の方がGUIがない分軽くなります。

2020年2月2日現在、最新のLTSは18.04.3です。2020年4月には新しいLTSが出てくる予定ですが、出始めは不具合も多いので、初心者はリリース後2~3ヶ月経つまでは古いLTSで様子を見た方がいいかもしれません。

インストール

説明サイトが他にあるのでそちらに譲ります

VirtualBox6にLinux(Ubuntu18.04LTS)をインストールする方法

必要十分な情報があり、クライアントとして使う分には申し分ない環境が整います。が、1件だけ追加の設定が…GUIの日本語設定が足りません。

[左下のアプリケーションを表示する]の点々を左クリックします。すると、以下のような画面が出るので…

ちょっとスクロールして下の方にある「言語サポート」を押してください。アプリが起動して、以下のダイアログが出ます。

ここで、インストールを選択します。パスワードを聞かれるので入力すると日本語サポートがインストールされます。

閉じれば完了です。

Tips.1. Terminal起動ショートカット

デフォルトショートカット、左Ctrl+Alt+TでTerminalを起動出来ます。結構便利。

Tips.2. Windowsアプリの切り替えをしたい

Alt+TABでアプリの切り替えを出来ますが、これはUbuntu内の切り替えになります。
Windows側の切り替えをキーボードからしたい場合は、右Ctrlキーを一度押してからAlt+TABでWindowsアプリを切り替えられます。

Tips.3. GUIが固まった。コマンドだけでも使えないか?

右Ctrl+F1~F7でUbuntu内の仮想端末を切り替えられます。
GUI画面はそのうち1つなので、仮想PC自体が固まってなければ、別の仮想端末からログインすることでコマンドが使えます。
sshなどでリモートから操作できるようにするのも手です。

Tips.4. ターミナルでのコピー&ペースト

WindowsだとCtrl+CとCtrl+Vでコピペですが、Linux GUIのターミナルだと基本はShift+Ctrl+CとShift+Ctrl+Vでコピペになります。
ようはShiftも押す必要があるということです。ターミナルだけですけどね。

まとめ

Windows上でUbuntuを同時に使えるようになりました。インストールしたUbuntuで動画を見ることも出来ますし、OpenGLも簡単なものならそれなりに動かすことが出来るはずです。サーバーとしての機能、ネットワーク系の設定は今回端折っていますが、次回sshとpostgresをインストールする際に説明予定です。

↓次回

未分類

実際このサイトどうせほとんど人来ないんだし、大事なものは何1つ置いてないので、セキュリティとかあまり考える必要もないのですが、放置して踏み台とかになるんだとちょっと困ります。

検討

適当にセキュリティ関連のプラグインでも入れればいいのかなぁとも思うのですが、それも速度面とか気になるし、いうてそんなセキュリティが欲しいわけでもないのです。すごい人が集まっていて、個人情報などを溜め込んでるとか、何か他人様の認証用パスワードなど漏れては困るものがあるとか、そういう事情がないので、何か特別に強化する必要のあるセキュリティがない…Windowsで例えて言えば、 標準的なセキュリティであるWindows Updateがちゃんと当たっていて、乗っ取られさえしなければいいってことです。

方法

というわけで、当サイトでは、

Geekflare WP Security Scanner – Powered by WPScan

を使うことにしました。これはプラグインとかではなく、外部サイトです。セキュリティチェックしたいWordPressサイトのURLを貼って実行するだけで以下のような判定をしてくれます。

結果を信用するなら、少なくとも自分で調べるよりかなり楽できます。

未分類

Google Search Console

このサイトはGoogle Analyticsは入れてないのですが、サイトに何も入れずに済むGoogle Search Consoleで、Google検索からの流入は見ていました。

Google Search Consoleの画面より

これがその画面です。なんと合計クリック数4。Google検索からは最大でも4人しか訪れてないってことです。検索で表示はしてくれてるみたいですし、コンテンツの問題だと一目で分かりますね。

ちなみにどんなページがクリックされてるのか?とか、検索キーワードが何だったのか?とか分かっちゃいます。このサイトであえてキーワードを選ぶとしたら、djangoとherokuだそうです。djangoはCGIでダメ出ししてるし、herokuも一度しか書いてないんですけどね。力入れてないのに出てくるってことは、恐らくその情報を欲してる人に対して供給してる人が少ないってことなんでしょうね。heroku+djangoの記事ならありかなぁとは思うので、そのうち書くかもしれません。

Google AdSense

そして僅かに2020年2月1日現在最大4人しか見てないであろうこのサイトに、広告であるGoogle AdSenseを導入しちゃいました。現在審査中です。せめて自分は審査結果に関係なく、たまにポチってあげようと思います。

目次を右側に付けたかったので付けてみたら、トップページに空白の目次がついてしまったので、これを誤魔化すのにも有効だったりします。


追記

審査通りました!

見積もり時点で0円。どんな広告が出るのか楽しみです。