Amazon Linux にApache Guacamoleをインストール

# はじめに
Apache Guacamoleはブラウザベースのリモートデスクトップクライアントです。
HTML5に対応しているブラウザでアクセスし、リモート接続することができます。

ここでは、Amazon Linuxを踏み台にして、別のWindows ServerにRDP接続することを目的としています。

# 環境
インスタンスは作成したばっかりの状態です。
Elastic IPは割り当ててあります。

```bash
$ uname -a
Linux ip-hoge-hoge-hoge-hoge 4.4.41-36.55.amzn1.x86_64 #1 SMP Wed Jan 18 01:03:26 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
```

# インストール 下準備

## yum update

```bash
$ sudo yum update
```

## EPEL有効化

```bash
$ sudo yum-config-manager --enable epel
```

## gcc

```bash
$ sudo yum install gcc
```

## JDK
事前にOracleからJDK8のrpmを入手して~/に配備する

```bash
$ sudo rpm -ivh jdk-8u121-linux-x64.rpm
$ vim .bash_profile
JAVA_HOME=/usr/java/default
export JAVA_HOME
$ source .bash_profile
```

## Maven

```bash
$ cd
$ curl -O http://ftp.jaist.ac.jp/pub/apache/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.zip
$ unzip apache-maven-3.3.9-bin.zip
$ sudo mv apache-maven-3.3.9 /opt/
$ vim .bash_profile
PATH=/opt/apache-maven-3.3.9/bin:$PATH
$ source .bash_profile
```

## Tomcat

### インストール

```bash
$ sudo useradd -s /sbin/nologin tomcat
$ curl -O http://ftp.kddilabs.jp/infosystems/apache/tomcat/tomcat-8/v8.5.11/bin/apache-tomcat-8.5.11.tar.gz
$ tar -xzvf apache-tomcat-8.5.11.tar.gz
$ sudo mv apache-tomcat-8.5.11 /opt/apache-tomcat
$ sudo chown -R tomcat:tomcat /opt/apache-tomcat
```

### サービス設定

```bash
$ sudo vim /etc/profile
```

3行追加

```bash:/etc/profile
JRE_HOME=/usr/java/default
CATALINA_HOME=/usr/local/tomcat
export JRE_HOME CATALINA_HOME
```

```bash
$ source /etc/profile
```

```bash
$ sudo vim /etc/init.d/tomcat8
```

```bash:/etc/init.d/tomcat8
#!/bin/bash
#
# tomcat8
#
# chkconfig: - 80 20
#
### BEGIN INIT INFO
# Provides: tomcat8
# Required-Start: $network $syslog
# Required-Stop: $network $syslog
# Default-Start:
# Default-Stop:
# Description: Tomcat 8
# Short-Description: start and stop tomcat
### END INIT INFO

## Source function library.
#. /etc/rc.d/init.d/functions
export GUACAMOLE_HOME=/etc/guacamole
export JAVA_HOME=/usr/java/default
export JAVA_OPTS="-Dfile.encoding=UTF-8 \
  -Dnet.sf.ehcache.skipUpdateCheck=true \
  -XX:+UseConcMarkSweepGC \
  -XX:+CMSClassUnloadingEnabled \
  -XX:+UseParNewGC \
  -Xms512m -Xmx512m"
export PATH=$JAVA_HOME/bin:$PATH
TOMCAT_HOME=/opt/apache-tomcat
TOMCAT_USER=tomcat
SHUTDOWN_WAIT=20

tomcat_pid() {
  echo `ps aux | grep org.apache.catalina.startup.Bootstrap | grep -v grep | awk '{ print $2 }'`
}

start() {
  pid=$(tomcat_pid)
  if [ -n "$pid" ] 
  then
    echo "Tomcat is already running (pid: $pid)"
  else
    # Start tomcat
    echo "Starting tomcat"
    ulimit -n 100000
    umask 007
    /bin/su -p -s /bin/sh $TOMCAT_USER $TOMCAT_HOME/bin/startup.sh
  fi


  return 0
}

stop() {
  pid=$(tomcat_pid)
  if [ -n "$pid" ]
  then
    echo "Stoping Tomcat"
    /bin/su -p -s /bin/sh $TOMCAT_USER $TOMCAT_HOME/bin/shutdown.sh

    let kwait=$SHUTDOWN_WAIT
    count=0;
    until [ `ps -p $pid | grep -c $pid` = '0' ] || [ $count -gt $kwait ]
    do
      echo -n -e "\nwaiting for processes to exit";
      sleep 1
      let count=$count+1;
    done

    if [ $count -gt $kwait ]; then
      echo -n -e "\nkilling processes which didn't stop after $SHUTDOWN_WAIT seconds"
      kill -9 $pid
    fi
  else
    echo "Tomcat is not running"
  fi

  return 0
}

case $1 in
start)
  start
;; 
stop)   
  stop
;; 
restart)
  stop
  start
;;
status)
  pid=$(tomcat_pid)
  if [ -n "$pid" ]
  then
    echo "Tomcat is running with pid: $pid"
  else
    echo "Tomcat is not running"
  fi
;; 
esac    
exit 0
```

```bash
$ sudo chmod +x /etc/init.d/tomcat8
$ sudo service tomcat8 start
$ sudo chkconfig tomcat8 on
```

### Manager Appの利用設定

ユーザ追加

```bash
$ sudo vim /opt/apache-tomcat/conf/tomcat-users.xml
```

```xml:tomcat-users.xml
<?xml version="1.0" encoding="UTF-8"?>
...
<tomcat-users xmlns="http://tomcat.apache.org/xml"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
              version="1.0">
...
  <role rolename="manager-gui"/>
  <user username="admin" password="admin" roles="manager-gui"/>
</tomcat-users>
```

アクセス制限解除

```bash
$ sudo vim /opt/apache-tomcat/webapps/manager/META-INF/context.xml
```

```xml:tomcat-users.xml
<?xml version="1.0" encoding="UTF-8"?>
...
<Context antiResourceLocking="false" privileged="true" >
  <!-- <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" /> -->
</Context>
```

## Required dependenciesになっているものをインストール
今回はRDP対応だけです。

```bash
$ sudo yum install cairo-devel libjpeg-turbo-devel libpng-devel uuid-devel freerdp-devel
```

# Guacamoleサーバ インストール

```bash
$ cd
$ curl -O http://ftp.meisei-u.ac.jp/mirror/apache/dist/incubator/guacamole/0.9.11-incubating/source/guacamole-server-0.9.11-incubating.tar.gz
$ tar -xzf guacamole-server-0.9.11-incubating.tar.gz
$ cd guacamole-server-0.9.11-incubating/

$ ./configure --with-init-dir=/etc/init.d
$ make
$ sudo make install
$ sudo ldconfig
$ sudo chkconfig guacd on
```

# Guacamoleクライアント インストール

```bash
$ cd
$ curl -O http://ftp.riken.jp/net/apache/incubator/guacamole/0.9.11-incubating/source/guacamole-client-0.9.11-incubating.tar.gz
$ tar -xzf guacamole-client-0.9.11-incubating.tar.gz
$ cd guacamole-client-0.9.11-incubating/
$ mvn package
$ sudo cp guacamole/target/guacamole-0.9.11-incubating.war /opt/apache-tomcat/webapps/guacamole.war
```

# Guacamole設定

```bash
$ sudo mkdir /etc/guacamole
```

```bash
$ sudo vim /etc/guacamole/guacamole.properties
```

```bash:guacamole.properties
guacd-hostname: localhost
guacd-port: 4822
user-mapping: /etc/guacamole/user-mapping.xml
```

```bash
$ sudo vim /etc/guacamole/user-mapping.xml
```

```xml
<user-mapping>
  <authorize
   username="Guacamoleへのログインユーザ名"
   password="Guacamoleへのログインパスワード(ハッシュ値)"
   encoding="md5">
   
    <connection name="RDP">
      <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>
    
  </authorize>
</user-mapping>
```

md5のハッシュ値は以下で確認可能です。
RDPの接続パスワードは、md5でハッシュ化しないでそのまま記述しています。
※encoding="md5" を記述しなければ素のパスワードも書けます

```bash
echo -n 'パスワード' | md5sum
```

設定が終わったら各サービスを再起動します。

```bash
$ sudo service guacd restart
$ sudo service tomcat8 restart
```

# キャプチャ

http://hoge.hoge.hoge.hoge:8080/guacamole/
からログインします。
![ログイン画面](https://qiita-image-store.s3.amazonaws.com/0/138821/bed4ae67-ef41-93f8-127e-26851dace83d.png)

ログインできました。
設定ファイルにアカウント情報を記述してあるので、なにも聞かれずに即座にRDPで接続されます。
![RDP画面](https://qiita-image-store.s3.amazonaws.com/0/138821/633ddd4c-d072-6f7c-3a81-263a72400aef.png)

サインアウトすると、こんな画面です。
「Recconect」で再接続し、「Logout」でログイン画面に戻ります。
![Disconnected画面](https://qiita-image-store.s3.amazonaws.com/0/138821/4ff8612d-2494-961f-06df-4ea7c851326b.png)

# TODO
/etc/init.d/tomcat8 に「GUACAMOLE_HOME」を記述するのは如何なものか。
なにか良い方法が分かれば修正する。

# 参考

・[Guacamole Manual](http://guacamole.incubator.apache.org/doc/gug/index.html)

・[踏み台サーバに最適！ブラウザからVNC、RDPに接続出来るリモートデスクトップクライアント『Guacamole』](https://orebibou.com/2015/02/%E8%B8%8F%E3%81%BF%E5%8F%B0%E3%82%B5%E3%83%BC%E3%83%90%E3%81%AB%E6%9C%80%E9%81%A9%EF%BC%81%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%81%8B%E3%82%89vnc%E3%80%81rdp%E3%81%AB%E6%8E%A5%E7%B6%9A%E5%87%BA/)

・[自宅サーバのバーチャルラボ化 (2) Guacamole導入](http://ao-zai.blogspot.jp/2015/09/2-guacamole.html)