SyntaxHighlighter

2015年9月30日水曜日

自宅サーバのバーチャルラボ化 (2) Guacamole導入

CentOS 6.6 に Guacamole 0.9.8 を導入します。

尚、root 権限が必要となるコマンドについては sudo で実行しています。 sudo の設定については過去記事で触れていますが、必須ではないので、sudo 設定をしていなくても $ sudo が頭についているコマンドは root に su - してから sudo を付けずに実行することでも可です。

まずは前提となるパッケージを yum コマンドでインストールしていきます。前提パッケージは http://guac-dev.org/doc/gug/installing-guacamole.html#required-dependencies で確認できます。今回は Guacamole 経由で ssh と RDP を使いたいので、それ用の Optional Packages も入れています。telnet や VNC を使いたい場合は以下に記載した以外にも必要なパッケージがあるので、前述の URL で確認して入れてください。また、ソースからコンパイルするので、gcc も入っていなければ入れる必要があります。APサーバも別途用意する必要があるので、tomcat6 を入れます。

$ sudo yum install cairo-devel
$ sudo yum install libjpeg-turbo-devel
$ sudo yum install libpng-devel
$ sudo yum install uuid-devel
$ sudo yum install freerdp-devel
$ sudo yum install pango-devel
$ sudo yum install libssh2-devel
$ sudo yum install openssl-devel
$ sudo yum install gcc
$ sudo yum install tomcat6

公式サイトから guacamole-server-0.9.8.tar.gz をダウンロードしてホームディレクトリに置きます。wget で落としてもいいし PC で落として転送でも良いです。手順は省略します。解凍して configure します。

$ tar vxzf guacamole-server-0.9.8.tar.gz
$ cd guacamole-server-0.9.8
$ ./configure --with-init-dir=/etc/init.d
(出力一部省略)
------------------------------------------------
guacamole-server version 0.9.8
------------------------------------------------

   Library status:

     freerdp ............. yes
     pango ............... yes
     libssh2 ............. yes
     libssl .............. yes
     libtelnet ........... no
     libVNCServer ........ no
     libvorbis ........... no
     libpulse ............ no

   Protocol support:

      RDP ....... yes
      SSH ....... yes
      Telnet .... no
      VNC ....... no

   Init scripts: /etc/init.d

Type "make" to compile guacamole-server.

ここで、使いたいプロトコルのサポートが yes になっていることを確認して次に進んでください。
コンパイルしてインストールします。

$ make
$ sudo make install
$ sudo ldconfig

次にクライアントをインストールします。私はソースからインストールしたのですが、できあがったバイナリは公式サイトからダウンロードできる guacamole-0.9.8.war と変わりないので、war を落としてきて、/var/lib/tomcat6/webapps の中に置けばこの手順はスキップできます。が、せっかくやったので記録しておきます。まずは Apache Maven をインストールする必要があります。Maven 3.3 は JDK 1.7 以上が必要なので、最新の Java も入れてみました。

$ sudo yum install java-1.8.0
$ sudo yum install java-1.8.0-openjdk-devel
$ export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.51-3.b16.el6_7.x86_64
$ cd
$ wget http://ftp.kddilabs.jp/infosystems/apache/maven/maven-3/3.3.3/binaries/apache-maven-3.3.3-bin.tar.gz
$ tar vxzf apache-maven-3.3.3-bin.tar.gz
$ sudo mv apache-maven-3.3.3 /usr/local/
$ export M3_HOME=/usr/local/apache-maven-3.3.3
$ export M3=$M3_HOME/bin
$ export PATH=$M3:$PATH
$ mvn --version
Apache Maven 3.3.3 (7994120775791599e205a5524ec3e0dfe41d4a06; 2015-04-22T20:57:37+09:00)
Maven home: /usr/local/apache-maven-3.3.3
Java version: 1.8.0_51, vendor: Oracle Corporation
Java home: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.51-3.b16.el6_7.x86_64/jre
Default locale: ja_JP, platform encoding: UTF-8
OS name: "linux", version: "2.6.32-504.el6.x86_64", arch: "amd64", family: "unix"

ここまでで Maven のインストールが完了です。Maven はここでしか使わず、後のプロセスには出てきませんので、うまくいかない場合はあきらめて war ファイルの配置に進みましょう。ここではうまくいったと仮定して進めます。クライアントのソースは、サーバのときと同様に公式サイトから guacamole-client-0.9.8.tar.gz をダウンロードしてホームディレクトリに置いてください。

$ tar vxzf guacamole-client-0.9.8.tar.gz
$ cd guacamole-client-0.9.8
$ mvn package
(出力一部省略)
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 04:42 min
[INFO] Finished at: 2015-09-23T17:51:54+09:00
[INFO] Final Memory: 36M/107M
[INFO] ------------------------------------------------------------------------

これで ~/guacamole-client-0.9.8/guacamole/target の中に guacamole-0.9.8.war ができたはずです。この guacamole-0.9.8.war または公式サイトから落としてきた guacamole-0.9.8.war を、/var/lib/tomcat6/webapps の中にコピーしてください。

$ sudo cp ./guacamole/target/guacamole-0.9.8.war /var/lib/tomcat6/webapps/

Guacamole の設定ファイルを置く場所を作り、起動ファイルに環境変数として設定します。尚、この置き場所のパスも環境変数の指定の仕方も、これが必須というわけではないのでわかる方は好きにしてください。

$ sudo mkdir /usr/local/guacamole
$ sudo vi /etc/rc.d/init.d/guacd
※以下の一文を、### END INIT INFO の下あたりに追加して保存
GUACAMOLE_HOME=/usr/local/guacamole
$ sudo vi /etc/sysconfig/tomcat6
※以下の一文を、末尾に追加して保存
GUACAMOLE_HOME=/usr/local/guacamole

Guacamole へのログインは、自分が使うだけですので Guacamole の設定ファイルに直接記述する独自アカウントにしています。大人数の組織で利用する場合は LDAP 連携なんかもできるみたいですが、その方法については試していないので取り上げません。
ログイン用のパスワードをハッシュ化します。以下のコマンドを打つと32桁の英数字(とスペースと-)が表示されますので、その英数字をコピーしておいてください。

$ echo -n 'パスワード' | md5sum

GUACAMOLE_HOME に user-mapping.xml を作成します。以下のサンプルでは、ssh の接続先が1つと rdp の接続先2つを設定しています。 注意すべきはプロトコルのところで、大文字で書くとエラーになって動作しませんので必ず小文字で書きましょう。 ここに記載した内容だけで充分使えますが、ssh や rdp 接続時のアカウントやパスワードを予め指定しておいたりとか、他にもいろいろとパラメータ指定が可能ですので、詳しくは公式サイトのマニュアルを見てみてください。

$ cd /usr/local/guacamole
$ sudo vi user-mapping.xml
<user-mapping>
        <authorize username="ログインユーザ名" password="コピーしたパスワードのハッシュ" encoding="md5">
                <connection name="cent1">
                        <protocol>ssh</protocol>
                        <param name="hostname">192.168.1.10</param>
                        <param name="port">22</param>
                </connection>
                <connection name="win2012r2-1">
                        <protocol>rdp</protocol>
                        <param name="hostname">192.168.1.11</param>
                </connection>
                <connection name="win2012r2-2">
                        <protocol>rdp</protocol>
                        <param name="hostname">192.168.1.12</param>
                </connection>
        </authorize>
</user-mapping>

ここまでできたらとりあえず動くはずなので起動してみましょう。

$ sudo /etc/init.d/tomcat6 start
$ sudo /etc/init.d/guacd start

以下は必須ではないですが、URL を簡単にするため&バージョンアップ時の影響が無いようにシンボリックリンクを貼っておきます。

$ cd /var/lib/tomcat6/webapps
$ sudo ln -s guacamole-0.9.8 g

ブラウザで、『http://Guacamole をインストールしたサーバのIP:8080/g/』 にアクセスします。ログイン画面が表示されれば成功です。 尚、iptables などでパケットフィルタリングをしている場合は 8080/tcp のアクセスを許可してください。
以下は Chrome でアクセスして ssh や rdp までしてみた動画です。この後の https 設定まで終わっている状態で撮ったので https ですが動作は全く同じなので気にしないでください。

OS起動時に自動的に起動するようにしたい場合はランレベルに応じた rc.d フォルダの中に起動ファイルのシンボリックリンクを貼ります。 tomcat6 は予め K20 でシンボリックリンクが貼られているので S98 に変えています。

$ cd /etc/rc.d/rc3.d
$ sudo mv K20tomcat6 S98tomcat6
$ sudo ln -s ../init.d/guacd S99guacd
$ cd /etc/rc.d/rc5.d
$ sudo mv K20tomcat6 S98tomcat6
$ sudo ln -s ../init.d/guacd S99guacd

このままでは通信が https ではなく http で、アクセスログも取れていない状態なので、https 化とアクセスログ取得の設定をします。 まずは https で使用する証明書の作成。 暗号化することだけが目的のいわゆる俺俺証明書なので、いろいろと入力しなければなりませんが最初のパスワード以外は適当でOKです。 最後の鍵パスワードもそのまま RETURN キーで。

$ sudo chown tomcat /usr/share/tomcat6
$ sudo -u tomcat keytool -genkey -alias tomcat -keyalg RSA
キーストアのパスワードを入力してください:※いい感じのパスワードを入力
新規パスワードを再入力してください:※いい感じのパスワードを再入力
姓名を入力してください。
  [Unknown]:  hogehoge
組織単位名を入力してください。
  [Unknown]:  org
組織名を入力してください。
  [Unknown]:  test
都市名または地域名を入力してください。
  [Unknown]:  test
都道府県名を入力してください。
  [Unknown]:  Kanagawa
この単位に該当する2文字の国コードを入力してください。
  [Unknown]:  JP
CN=hogehoge, OU=org, O=test, L=test, ST=Kanagawa, C=JPでよろしいですか。
  [いいえ]:  y

<tomcat>の鍵パスワードを入力してください
        (キーストアのパスワードと同じ場合はRETURNを押してください):

tomcat の設定ファイルを編集します。

$ cd /etc/tomcat6
$ sudo cp -ip server.xml server.xml.bak
$ sudo vi server.xml

以下の記述があるはずです。

    <!--
    <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
               maxThreads="150" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS" />
    -->

以下のように書き換えます。(コメント記号の行を削除して keystoreFile から始まる行を追加)

    <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
               maxThreads="150" scheme="https" secure="true"
               keystoreFile="/usr/share/tomcat6/.keystore" keystorePass="証明書作成時に指定したパスワード"
               clientAuth="false" sslProtocol="TLS" />

以下の記述があるはずです。

        <!--
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log." suffix=".txt" pattern="common" resolveHosts="false"/>
        -->

以下のように書き換えます。(コメント記号の行を削除して directory と pattern の値を変更。)
コメント行削除はしないとアクセスログが出ないので必須ですが、directory と pattern の値変更は任意です。 その他の属性も好みに合わせていろいろとカスタマイズ可能なので、気になる方は以下のサイトなどを参考に設定を変えてください。
Tomcatのアクセスログを出力する - Miuran Business Systems

        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="/var/log/tomcat6"
               prefix="localhost_access_log." suffix=".txt" pattern="combined" resolveHosts="false"/>

編集が完了したら保存して tomcat を再起動。

$ sudo service tomcat6 restart

iptables を設定している場合はアクセス許可ポートを 8080/tcp から 8443/tcp に変更して、ブラウザで『https://Guacamole をインストールしたサーバのIP:8443/g/』 にアクセスします。証明書が信用できないエラーが出て、無視して続行するとログイン画面に遷移して正常に利用でき、アクセスログも directory で指定した場所にできていれば成功です。

後はルータなどを設定して、8443/tcp で Guacamole サーバに外からアクセスできるようにすれば完成!

2015年9月27日日曜日

自宅サーバのバーチャルラボ化 (1) 背景

Microsoft とか VMware とか NetApp のバーチャルラボをよく使わせてもらっていて、非常に便利で感動しているのですが、当然ながらあるシナリオに沿って用意された環境なので何でも自分の好き勝手にできるというわけではありません。Windows サーバの動作確認であれば、たいていのラボにあるのでシナリオとは無関係でも試せたりするのですが、Linux 系の何かを調べたり試したりしたいときとか、ラボとは無関係なアプリケーションの評価版を導入して検証したいとかは難しい場合が多いです。また、期限もあるので、短時間で済む確認ならいいのですが、長期に渡って環境を維持することはできず、例えば Windows サーバの日本語化が必要な場合とか毎回行わなければならなくて面倒です。というわけで自宅サーバを外からブラウザだけでいじれたらいいのになぁ、と思ったのがきっかけ。ちなみに自宅サーバは HP の MicroServer で、無償版の ESXi 上に CentOS やら評価版の Windows Server やらが乗っています。会社から接続したいので以下が条件。

  • ブラウザだけで動作すること。プラグインも不可。
  • https で通信できること。
  • ブラウザ内で RDP 接続できること。
  • 無料で利用できること。

で、この条件をクリアできるソフトウェアとして、Guacamole を CentOS に導入することにしました。次回乞うご期待。

2015年9月26日土曜日

sudo

いつからなんでしょう。技術雑誌やWeb上の記事で Linux のコマンドが掲載される際に、root で実施するコマンドの前には sudo が付くようになっていますね。 昔はコマンドの前に $ が付いていれば一般アカウント、# なら root という記載方法だったんですが、最近見る記事は全部、$ が一般アカウントなのはそのままですが、root 権限で実行するコマンドには $ sudo が付いています。そして、記事中に $ sudo についての説明は一切無いです。初心者お断り?
sudo を使うこと自体は賛成なんですけども、初心者が雑誌やWebの記事を頼りにコマンドを書いてある通り打ち込んでみて、「ユーザー名 は sudoers ファイル内にありません。この事象は記録・報告されます。」とかいうよくわからないけど恐ろしげなエラーメッセージを目にして萎えたりすることを思うと胸が痛みます。まぁ、Linux いじっていれば、sudo に限らず、記事では書かれていないエラーが出まくり、それをググりまくって自己解決していかなければならないなんてことは日常茶飯事で、それを繰り返していくことで力が付いていくものだと思うわけですが、それ(環境依存の予期せぬエラー)と sudo の件とはちょっと違うと思います。昔ながらの su - で root になるやり方は、OSをインストールしたままのデフォルト状態で誰でも実行できるのに対し、sudo は多分どういうインストール方法をしてもデフォルトで誰でも使えるようにはなっていないはず。絶対に設定が必要だとわかっているのに、それについての説明が一切ない。勿論全ての記事にいちいち sudo の設定方法を書ける訳ないということはわかっていますが、記事中で普通に $ sudo 書くのなら、一言その設定方法へのポインタだけでも指し示してあげて欲しいなぁ、と Linux 使いが増えて欲しい私としてはそう思います。(雑誌などの、有料の媒体だけでも)

というわけで今回は sudo の設定方法について書こうかと思ったのですが、とてもわかりやすく説明してあるサイトを見つけて、補足したいことも特に無いのでそちらのリンクを貼っておきます。

一般ユーザーを sudo できるようにする - maruko2 Note.

2015年9月25日金曜日

ブログ引越し

以前はXREAの無料サーバに自分でMovable Typeを構築してそこで運用していました。
久々に更新しようとしてみたら、DBが空っぽになっている。DBのバージョンアップに伴って空にされたようです。 バージョンアップ前のバックアップは自動的に取られているし、事前に通知は来ていて、自分が見てなかっただけなので、空になっていること自体は問題ありません。 ただ、復活させようとまずはDBを管理画面から生成しようとしたら、管理画面のDB系のページだけが真っ白で何も表示されない。 サポートフォーラムの過去ログを見る限り、これはサーバ側の問題で、管理者が対応してくれるまでは駄目みたいです。 しかも管理画面の他のページを色々と見ているうちに、容量制限の9割を既に使用しているということが発覚。 50MBて・・・今どき少なすぎるでしょ。
というわけでDBが復活しても追加の記事を作るのも難しそうなので、Bloggerに移行することにしました。 XREAの記事もDBが復活したらコンバートして持ってくるつもりです。
Movable TypeからBloggerへのコンバートについてはググるとたくさんページが出てきましたが、基本的にはだいたいどこでも書いていることは同じ感じ。 MovableType2Bloggerというツールを使うらしいんですが、リンク先のhttp://movabletype2blogger.appspot.com/が404 NotFoundになってしまっています。
親切な方が自分のサイトに設置してくださっているのでこちらを使わせてもらう予定です。http://syasuda.com/t/tools.html
また、日付の変換についてはこちらかな。http://www.kuribo.info/2012_05_01_archive.html
実際やってみたらまた報告します。