未分類

GUIなLinuxからsshを使って別のGUIなLinuxに入って作業するとき、たまにXの画面が欲しいときがあります。そういうときssh -Xで繋ぐと手元の画面にリモートのGUIアプリを表示して操作することができます。便利な小技ですよね。

$ ssh -X user-name@remote-host
$ gedit

しかし、こうして繋いだ場合も、管理者権限が必要とかでsudoでGUIアプリを起動すると使えないというケースがよくあります。Xの認証の仕組みから使えないのですが、今回はsudoした先でGUIアプリを起動する方法を説明します。

ただし、本番運用の公開サーバーでX関係のライブラリなど必要のないパッケージを入れるのは個人的にはやめた方がいいと思います。あくまで複数のGUIを持つLinux開発マシンを渡り歩くときの小技です。また使い終わったらゴミを残さないようにしましょう。

未分類

前回はVALUE SERVERというレンタル共有サーバーから、ConoHaのVPSに引っ越した話をしました。

今回以降はしばらくそのとき行った設定などのメモをしておきます。

未分類

概要

前回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をインストールしてみます。

未分類

ここでは、本サイトで実施しているDBのみの手作業移行について解説します。簡単で、用途もデバッグ用なので、方法も適当です。

目的

DBのデータを運用しているサイトからlocalデバッグ環境に移行する

方針

ファイルはgitで管理されているので、DB内のデータのみ移行したいということです。プラグインを使うと、ファイルまで一緒についてきたり、サーバに余計なプラグインを設置しないといけなくなります。ローカルでサーバと同じデータを使ってデバッグ/テストしたいという目的であれば、DBの内容だけ適当にコピーできれば良く、できればコマンド一発で簡単にやりたいというわけです。

mysqlのデータをVALUE SERVER上でファイルに落とす

VALUE SERVER上で以下のスクリプト($HOME/bin/hoge.sh)を使うと、標準出力に、圧縮したWordPress関連のテーブルデータを全て出力できます。

#!/bin/sh
TABLES="wp_commentmeta wp_comments wp_links wp_options wp_postmeta wp_posts wp_term_relationships wp_term_taxonomy wp_termmeta wp_terms wp_usermeta wp_users"
mysqldump --user=$USER -p $USER $TABLES | gzip

実行すると、MySQLのパスワードが聞かれます。このファイルには実行可能属性を付けておきます。

$ chmod u+x $HOME/bin/hoge.sh

なお、使用しているコマンドのmysqldumpはあまり早くない汎用性の高いコマンドです。大量のデータがあって、いつまで経っても終わらない場合は別の方法にすべきです。このサイトは2020年1月23日現在圧縮して1MBに満たないサイズです。

ローカル環境から直接ファイルに落とす

上のスクリプトと、前回整えたsshの公開鍵認証を使って、ローカル環境から直にVALUE SERVER上のMySQLデータをファイルに落とすことができます。以下がそのコマンドです。

$ echo (MySQLパスワード) | ssh xxxxxxxx@xx.valueserver.jp ./bin/hoge.sh > mysqldat.gz

リダイレクトを使うことで、暗号化された経路でコマンドに履歴を残したり、一時ファイルを作成することなく、綺麗にデータを落とすことができています。さらに、VALUE SERVER上のhoge.shすら使用しないローカルスクリプト(export_db.sh)も書いてみました。

#!/bin/sh
SSH_USER="xxxxxxxx"
SSH_SERVER="xx.valueserver.jp"
MYSQL_PASSWD="yyyyyyyyy"
TABLES="wp_commentmeta wp_comments wp_links wp_options wp_postmeta wp_posts wp_term_relationships wp_term_taxonomy wp_termmeta wp_terms wp_usermeta wp_users"
OUTFILE=mysql.dat.gz
echo $MYSQL_PASSWD \
    | ssh $SSH_USER@$SSH_SERVER "mysqldump --user=$SSH_USER -p $SSH_USER $TABLES | gzip" > $OUTFILE

完成したタイミングでVALUE SERVER上のhoge.shは削除しました。sshは痕跡をあまり残さず何でも出来て便利だけど、ここが乗っ取られたら大変なことになることがよく分かります。

落としたファイルをローカルDBに流し込む

今回流し込むローカルDBは以前書いた記事のものを使います。

まずはdockerを起動して

$ docker-compose up

その後、以下のスクリプト(import_db.sh)で取り込みます。

#!/bin/sh
MYSQL_DB="exampledb"
MYSQL_USER="exampleuser"
MYSQL_PASSWD="examplepass"
CONTAINER="docker_db_1"
OUTFILE="mysql.dat.gz"
gzip -dc $OUTFILE | docker exec -i $CONTAINER mysql --default-character-set=utf8 -D $MYSQL_DB -u $MYSQL_USER --password=$MYSQL_PASSWD
docker exec -i $CONTAINER mysql --default-character-set=utf8 -D $MYSQL_DB -u $MYSQL_USER --password=$MYSQL_PASSWD <<EOF
update wp_options set option_value='http://localhost' where option_name in ('siteurl', 'home');
commit;
EOF

実行時にパスワードが引数で渡されることに警告が出ますが、デバッグ用の環境で固有名詞は適当なので、気にしないことにします。

また、取り込んだ後にSQLのUpdate文でWP_OPTIONテーブルを修正していたりもします。しかしその部分も最低限で、リンクなどの修正やその他の細かい変更もしていません。これらは運用サイトの状態をなるべく変えないことを意図しています。

まとめ

dockerが起動していれば、ローカルでexport_db.shとimport_db.shを実行するだけでVALUE SERVERのデータを取り込むことが出来た。

未分類

どこでも腐るほど解説はされてると思うし、VALUE SERVERで特別なこともないとは思いますが、念の為記事にしておきました。

対称鍵の作成

VALUE SERVERではなく今ログインしている端末(Linuxを想定)で、公開鍵認証で使用する公開鍵とその対象鍵である秘密鍵を同時に作成します。

$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/ユーザー名/.ssh/id_rsa): 

作成した鍵を格納するファイルパスを聞かれるのでそのままEnterを押しておきます。

Enter passphrase (empty for no passphrase):

次にパスフレーズを聞かれます。これは秘密鍵に掛けるパスワードのようなものです。秘密鍵を単独で盗まれてもそこに鍵がまだかかっているような形になります。セキュリティ的にはあるべきですが、理由があればなくても構いません。

Enter same passphrase again:

再度聞かれるので、同じものを入力します。すると、最終的に

  • $HOME/.ssh/id_rsaに秘密鍵
  • $HOME/.ssh/id_rsa.pubに公開鍵

が作られます。

VALUE SERVERに公開鍵を設置

ssh-copy-idというコマンドを使うのが簡単です。下で、xxxxxxxx@xxx.valueserver.jpは、VALUE SERVERのユーザ名とホスト名を@で繋いだ文字列です。

$ ssh-copy-id xxxxxxxx@xxx.valueserver.jp
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/ユーザー名/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
xxxxxxxx@xxx.valueserver.jp's password: 

VALUE-SERVERのパスワードを聞かれるので、従来どおりに入れてください。正しいパスワードで認証されれば、公開鍵をVALUE SERVERに設置してくれます。

VALUE SERVERに公開鍵認証でログイン

いつもどおりログインするだけです。パスワードの代わりにパスフレーズを使うだけ。パスフレーズを設定していなければ、何も聞かれずにログインできます。

user@user-pc:~$ ssh xxxxxxxx@xxx.valueserver.jp
Last login: Wed Jan 22 00:00:00 2020 from somedomain.net

xxxxxxxx@xxx:~$

参考までに公開鍵は、VALUE SERVERの、$HOME/.ssh/authorized_keys に保存されています。

参考

How to Use SSH Public Key Authentication – ServerPilot