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

2015年9月30日水曜日

その他IT

t f B! P L

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 サーバに外からアクセスできるようにすれば完成!

QooQ