Guacamoleの設定方法



●概要

 いろいろ良さげなものを探していたらguacamoleを発見しました。
  http://guacamole.sourceforge.net/
 HTML5とAJAXに対応したブラウザでVNCサーバに接続できるというものらしいです。WEBブラウザとguacamole間はhttpプロトコルでguacamoleとVNCサーバー間はVNCプロトコルで接続されます。guacamoleの設置場所にさえ気をつければhttp-proxyを介さないとインターネットにアクセス出来ない環境でも使えます。
 インストールの仕方は公式に書いてあるとおりです。guacamoleはJAVAサーバーアプリなのでアプリサーバーであるtomcatが必要です。guacamole.xmlを編集しguacamole.warの配備場所やVNCサーバーへの接続設定を設定します。
 guacamole-users.xmlの内容を編集し接続時のユーザー名とパスワードを設定してください。
 インターネット越しに使う場合は、Apacheを通してhttpsとか使ったほうが良いです。

●インストール(スクリプト):推奨

 参照URL:CentOS 7にRDP/SSH/VNCの踏み台サーバであるApache Guacamole(0.9.9)をインストールする

 Apache Guacamoleのインストールをします。
# yum install -y wget git
# wget http://sourceforge.net/projects/guacamoleinstallscript/files/CentOS/guacamole-install-script.sh
# chmod +x guacamole-install-script.sh
# LANG=C ./guacamole-install-script.sh
 インストールスクリプトを実行すると、下記のような表示がされ、設定項目(DBのユーザ名やパスワードなど)を入力していきます。
 入力が終わったらインストールが始まります(事前にSSL証明書を設定していたためか、証明書に内容について特段の対応はありませんでした)。

guacamole001.png

 「https://IPアドレスorホスト名/guacamole」へブラウザからアクセスすると、ログイン画面が表示されます。
 ログイン(デフォルトのID/PWはguacadmin/guacadminです。)後、「settings」を開くと、様々な設定ができます。「guacadmin」ユーザは管理権限が設定されているので、デフォルトパスワードは変更しておきましょう。

●インストール(EPEL)

 2018.02.16現在、EPELからguacamole本体をインストールすることができませんでした(guacamole-server-debuginfo-0.9.13-1.el7.x86_64では動作しません)。

 yumのレポジトリにEPELを追加します。
※CentOS 6の場合
# rpm -ivh  http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
# yum update
CentOS 6の場合guacamoleをyumコマンドでインストール出来ないため、
下記ページを参照してwarファイルを保存しました。
Guacamole on Fedora and CentOS/RHEL 6
guacamoleログイン時にInvalid Loginと表示された場合は、
Invalid Loginが表示されるを参照してください。
※CentOS 7の場合
# rpm -ivh  http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
# yum update
 次に、以下のコマンドでGuacamoleその他必要なパッケージをインストールします。
# yum -y install guacd libguac-client-rdp libguac-client-vnc libguac-client-ssh guacamole
準備しています...              ################################# [100%]
更新中 / インストール中...
   1:libguac-1:0.8.4-4.el7            ################################# [ 20%]
   2:guacd-1:0.8.4-4.el7              ################################# [ 40%]
   3:libguac-client-rdp-1:0.8.4-4.el7 ################################# [ 60%]
   4:libguac-client-ssh-1:0.8.4-4.el7 ################################# [ 80%]
   5:libguac-client-vnc-1:0.8.4-4.el7 ################################# [100%]
 EPELリポジトリを常に利用できる状態にしている場合、上記でインストールしたものがアップデートされないよう/etc/yum.confを変更します。
# vi /etc/yum.conf
(変更箇所のみ記載)
exclude=libguac* guacd*
 インストール完了後、サービスの自動起動設定を行います。
# systemctl enable guacd
# systemctl enable tomcat
 これで設定準備は完了です。

●Guacamoleの設定

 バージョン0.9.13では/etc/guacamole/user-mapping.xmlを使用しなくなり、データベースに登録されるようになった。

 ●インストール(スクリプト)でインストール後、SettingsでSSHまたはVNCをアカウント及びパスワードを設定して保存してしまうと、次のログイン後、いきなり直接SSHまたはVNCで接続することとなり、Settings等の変更作業が実施できなくなってしまいます。
 その場合は、/guacamole/#/settings/mysqlにアクセスすることにより設定画面が表示されるようになります。



 インストール完了後、Guacamoleの設定を行います。
 guacamole.propertiesというファイルがない場合は作成してください。
# vi /etc/guacamole/guacamole.properties
# Hostname and port of guacamole proxy
guacd-hostname: localhost
guacd-port:     4822
# Auth provider class (authenticates user/pass combination, needed if using the provided login screen)
auth-provider: net.sourceforge.guacamole.net.basic.BasicFileAuthenticationProvider
basic-user-mapping: /etc/guacamole/user-mapping.xml
 /etc/guacamole/user-mapping.xmlを開き、以下のように編集します。内容は自身の環境に合わせて記述します。
<user-mapping>
    <authorize
     username="Guacamoleへのログインユーザ名"
     password="Guacamoleへのログインパスワード(ハッシュ値)"
     encoding="md5">
 
        <connection name="接続先の名称1">
            <protocol>接続に利用するプロトコル</protocol>
            <param name="hostname">接続先ホスト名(IPアドレス)</param>
        </connection>
 
        <connection name="接続先の名称2">
            <protocol>接続に利用するプロトコル</protocol>
            <param name="hostname">接続先ホスト名(IPアドレス)</param>
        </connection> 
 
        …
 
    </authorize>
</user-mapping>
 パスワードのハッシュ値については、以下のコマンドで求める事が出来ます。
# echo -n 'パスワード' | md5sum
 接続先については、以下の設定例のように記述出来ます。
<connection name="RDP(Windows Server)">
    <protocol>rdp</protocol>
    <param name="hostname">IPアドレス</param>
    <param name="username">RDPで接続するユーザ名</param>
    <param name="password">RDPで接続するパスワード</param>
    <param name="domain">RDPで接続するADドメイン</param>
    <param name="port">RDPで接続するポート</param>
</connection>  
 
<connection name="VNC(Linux Server)">
    <protocol>vnc</protocol>
    <param name="hostname">IPアドレス</param>
    <param name="password">VNCで接続するパスワード</param>
    <param name="port">RDPで接続するポート</param>
</connection>
 
<connection name="SSH(Linux Server)">
    <protocol>ssh</protocol>
    <param name="hostname">IPアドレス</param>
    <param name="username">SSHで接続するユーザ名</param>
    <param name="password">SSHで接続するパスワード</param>
    <param name="port">SSHで接続するポート</param>
</connection>
 
<connection name="Telnet(Linux Server)">
    <protocol>telnet</protocol>
    <param name="hostname">IPアドレス</param>
    <param name="username">Telnetで接続するユーザ名</param>
    <param name="password">Telnetで接続するパスワード</param>
    <param name="port">Telnetで接続するポート</param>
</connection>
 設定出来るパラメーターについては、こちらを参してください。設定完了後、下記コマンドでGuacamole及びTomcatを起動させます。
	
# systemctl start guacd
# systemctl start tomcat
 これでGuacamoleを利用する準備が出来ました。
 http://localhost:8080/guacamole/とアクセスすればログイン画面が表示されます。

●SSLへの対応

 上記までの設定の場合、httpアクセスによる接続になるためインターネット経由ではアカウント及びパスワード漏洩の危険性があります。そのため、https接続できるようにTomcatを設定変更します。
 SSLは自己証明書で対応することとします。
 TomcatでSSLを利用できるようにします。
 keystoreファイルを作成します。
$ /etc/alternatives/keytool -genkey -alias tomcat -keyalg RSA
 対話形式でいろいろ質問されます。パスワードは後で使用するので忘れないように注意します。.keystoreファイルがローカルユーザーのフォルダ配下に作成されます。
 tomcatをSSLに対応させるため設定ファイル変更します。
# vi /etc/tomcat/server.xml
<Connector port="8443"
           protocol="org.apache.coyote.http11.Http11Protocol"
           maxThreads="150"
           SSLEnabled="true"
           scheme="https"
           secure="true"
           clientAuth="false"
           sslProtocol="TLS"
           keystoreFile="keystoreの保存場所"
           keystorePass="パスワード" />
 Tomcatを再起動します。ファイアーウォールを設定している場合は、8443ポートを使用できるように設定変更します。
# systemctl restart tomcat
 ブラウザで、https://localhost:8443/にアクセスして、Tomcatの管理画面が開けば設定変更完了です。
 ここまでの設定の場合、下記のようなURLでアクセスすることになります。
https://(接続先サーバ)名:8443/guacamole/index.xhtml

 これをhttps://(接続先サーバ)名/guacamole/index.xhtmlのようにアクセスできるように設定変更します。
# vi /etc/httpd/conf.d/proxy_ajp.conf
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
ProxyPass /tomcat/ ajp://localhost:8009/
ProxyPass /examples/ ajp://localhost:8009/examples/jsp/
ProxyPass /guacamole/ ajp://localhost/guacamole/ ← 追記
 HTTPを再起動します。
# systemctl restart httpd
 これで設定は完了です。

●SSHの鍵を使用しての接続方法

 下記のように設定しましたが、Password:が表示されパスワードを入力しても「SSH auth failed.」となり接続できません。
        <connection name="server1">
           <protocol>ssh</protocol>
            <param name="hostname">192.169.0.1</param>
            <param name="port">22</param>
            <param name="username">hogehoge</param>
            <!-- <param name="password">password</param> -->
            <param name="passphrase">password</param>
            <param name="private-key">-----BEGIN DSA PRIVATE KEY-----
            aaaabbbbcccc........
            -----END DSA PRIVATE KEY-----</param>
        </connection>
 いろいろ調べましたがうまくいきませんでいた。

●Fedora 22にインストールしたがsshやvnc接続後、画面が真っ黒のままとなる

 guacamoleのログインは問題なかったが、その後のSSHやVNCで接続しようとすると画面が真っ黒のまま表示されない現象が発生しました。
 Tomcatのアクセスログ(usr/share/tomcat/logs/localhost_access_log.yyyy-mm-dd.txt)を確認すると下記のようなログを見つけました。
"GET /guacamole/guacamole-common-js/all.min.js HTTP/1.1" 404 1056
 all.min.jsというファイルが見つからない、と言っています。
 インターネットで調べたところ、Showing black screen after I try to connect to connection.というのが見つかりました。そのページからall.min.jsをダウンロードし、/usr/share/tomcat/webapps/guacamole/guacamole-common-jsに保存し、Tomcatを再起動したところ真っ黒な画面ではなくなりました。
 しかし今度は、「Clear Your Cache」が表示されるようになりました。ブラウザのキャッシュを削除しても、別のブラウザで接続してみても、状況は変わりませんでした。

 更に調べることになりました。

 その1:guacamole(guacamole-server-0.9.9:20160120現在最新版)をソースからインストールしてみる。
    make出来ず、諦める。
 その2:guacamole(上記より古いバージョン)をソースからインストールしてみる。
    make出来ず、諦める。
 その3:guacamole(0.9.3より古いバージョン)をsrpmからリビルドしインストールしてみる。
    他のモジュールの依存関係からリビルド出来ないため、諦める。

 結局のところ、「Clear Your Cache」を表示させる元のファイルは/usr/share/tomcat/webapps/guacamole/client.xhtmlあることが分かり、下記部分を コメントアウトしたところ正常に接続されるようになりました。

# vi /usr/share/tomcat/webapps/guacamole/client.xhtml
  :
(途中省略)
  :
// Sanity check Guacamole JavaScript API version
// if (Guacamole.API_VERSION !== "0.9.3")
// GuacUI.Client.showStatus("Clear Your Cache", "An older version of Guacamole has been cached by your browser. Please clear your browser's cache and try again.");

// Start connect after control returns from onload (allow browser
// to consider the page loaded).
// else
window.onload = function() {
window.setTimeout(GuacUI.Client.connect, 10);
};
/* ]]> */


 以上で対応完了です。

●SSH auth failedと表示される

 guacamoleにログイン後、あるマシンにSSHで接続したところSSH auth failedと表示され接続できませんでした。ログイン先のログを確認したところ下記のようなものが記録されていました。
imuxsock lost 154 messages from pid 2185 due to rate-limiting
 外部からアタックされているときにも上記のようなログが記録されるようですが、今回はアタックとは関係ないことは明白です。そこで、問題なくSSH接続できるサーバの設定を確認したところ、下記の設定が異なっていました。
# vi /etc/ssh/sshd_config
PasswordAuthentication no
 ↓
PasswordAuthentication yes
 上記のように設定変更し、SSHサービスを再起動後問題なく接続されるようになりました。

●Invalid Loginが表示される

 CentOS 6は、yumコマンドを使用してguacamoleをインストールすることができません。そのため、http://guac-dev.org/releasesからguacamole-x.x.x.warをダウンロードします。そのファイルを/usr/share/tomcat6/webappsにコピーします。
 その後、ログイン画面からログインしましたがInvalid Loginが表示されました。いろいろ調べてみましたが、下記の方法により解決しました。
# chown -R root:tomcat /etc/guacamole/
# systemctl restart tomcat
 ログインはできるようになりましたが、今度はconnection errorが表示されるようになってしまいました。ログには下記のように記録されていました。
Error reading "connect": Illegal state: Instruction read did not have expected opcode


●Unauthorizedと表示される

 mod_securityで引っ掛かっていることがわかりましたので、除外するように設定変更しました。

●ログイン後、画面が真っ白のまま表示されない

 mod_securityで引っ掛かっていることがわかりましたので、除外するように設定変更しました。

●HTTP tunnel request failed: End of stream while waiting for "ready".と表示される

 Cent OS 6.4に0.9.9をインストールしました。ログイン後のsshやvncに接続しようとすると、CONNECTION ERRORとなり正常に接続できずに15秒ごとに再接続を繰り返します。
# tail -f /var/log/tomcat6/catalina.out
17:22:59.934 [TP-Processor10] ERROR o.g.g.s.GuacamoleHTTPTunnelServlet - HTTP tunnel request failed: End of stream while waiting for "ready".