xrdp でRDP Proxy ゲートウェイ を作る話(2)　〜RPMbuild編〜

# xrdp でRDP Proxy ゲートウェイ を作る話(2)　〜RPMbuild編〜

## [前回](https://qiita.com/JUNKER_TOMATO/items/f7c47b4a5415cfe7c44c)まで
前フリとしてxrdpで RDP Proxy mode を使用する場合に必要なものを書きました。<br>

## 対象ディストリビューション
ここでは RHEL8互換のRocky Linux 8.6 を対象とします。
(docker hubにある rockylinux:8.6 コンテナを利用して記事を書きました)

## 対象バージョン
記事執筆時点(2022/12/8)で、以下バージョンを対象とします。
* xrdp v0.9.20 
* NeutrinoRDP git hash #836b738
## build　環境の準備
build 環境をインストールします。
インストール直後の状態を想定しています。
rootユーザーにて実行してください。

```bash
# RockyLinux 8.6
dnf groupinstall -y "Development Tools"
dnf install -y epel-release
dnf --enablerepo powertools install -y gcc git cmake openssl-devel libX11-devel libXext-devel libXinerama-devel libXcursor-devel \
 libXdamage-devel libXv-devel libxkbfile-devel alsa-lib-devel cups-devel libjpeg-turbo-devel libXrandr-devel turbojpeg-devel pcsc-lite-devel \
 sudo wget which SDL2 hardlink imlib2-devel libXfont2-devel bash-completion tree sudo openssl pam-devel pkgconfig\(fuse\) pkgconfig\(pixman-1\) nasm checkpolicy selinux-policy-devel 

useradd -m builduser
usermod -aG wheel builduser
echo "builduser:<任意のパスワード>" | chpasswd
echo "builduser ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers.d/builduser 
su - builduser
cd ~ 
```
以降はビルド用ユーザ `builduser`を使用します。
## NeutrinoRDPのRPM作成
まず NeutrinoRDPをbuildします。

私のgithubのリポジトリからSRPMファイルをダウンロードしてください。
```bash
wget https://github.com/TOMATO-ONE/xrdp-proxy/raw/devel/centos/el8/SRPMS/neutrinordp-git836b738-1.el8.src.rpm
```

SRPMをインストールします。自動的にrpmbuildディレクトリが生成されてsourceファイルとSPECファイルが展開されます。
```bash
rpm -ivh ./neutrinordp-git836b738-1.el8.src.rpm
```

SPECファイルを元にrpmbuildコマンドで ソースコードをbuildし、rpm ファイルを生成します。
```bash
rpmbuild -bb --clean ~/rpmbuild/SPECS/neutrinordp.spec
```

正常にbuildできた場合、以下のようなツリーになっているはずです。
```bash
[builduser@fb9656c1967e ~]$ tree 
.
├── neutrinordp-git836b738-1.el8.src.rpm
└── rpmbuild
    ├── BUILD
    ├── BUILDROOT
    ├── RPMS
    │   └── x86_64
    │       ├── neutrinordp-devel-git836b738-1.el8.x86_64.rpm
    │       ├── neutrinordp-libs-git836b738-1.el8.x86_64.rpm
    │       ├── neutrinordp-plugins-standard-git836b738-1.el8.x86_64.rpm
    │       └── neutrinordp-xfreerdp-git836b738-1.el8.x86_64.rpm
    ├── SOURCES
    │   ├── CMakeLists.txt.patch
    │   └── neutrinolabs-neutrinordp-836b738.tar.gz
    ├── SPECS
    │   └── neutrinordp.spec
    └── SRPMS

8 directories, 8 files
```

## xrdp のRPM作成
buildした NeutrinoRDPをインストールします。
xrdpのbuildには `neutrinordp-devel` と　`neutrinordp-libs` が必要です。
```bash
cd ~/rpmbuild/RPMS/x86_64/
sudo dnf localinstall  -y  ./neutrinordp-devel-git836b738-1.el8.x86_64.rpm ./neutrinordp-libs-git836b738-1.el8.x86_64.rpm
cd ~
```

私のgit hubのリポジトリから RDP Proxy を有効にした xrdp のSRPMをダウンロードしてインストールしてください。
```bash
wget https://github.com/TOMATO-ONE/xrdp-proxy/raw/devel/centos/el8/SRPMS/xrdp-0.9.20-1.el8.src.rpm

rpm -ivh xrdp-0.9.20-1.el8.src.rpm
```

EPELにて提供している xrdp RPMパッケージとの主な変更点は
* configure オプションに `--enable-neutrinordp` を追加
* 依存パッケージから `tigervnc-server-minimal` `xorg-x11-xinit` を削除。
  → これらは Linux Desktopに RDPでGUIログインする場合には必要ですが、RDP Proxyだけの動作には不要です。


SPECファイルを元にrpmbuildコマンドで ソースコードをbuildし、rpm ファイルを生成します。
```bash
rpmbuild -bb --clean ~/rpmbuild/SPECS/xrdp.spec 
```

正常にbuildできた場合、最終的に以下の tree構成になります。
```bash
tree 
.
├── neutrinordp-git836b738-1.el8.src.rpm
├── rpmbuild
│   ├── BUILD
│   ├── BUILDROOT
│   ├── RPMS
│   │   └── x86_64
│   │       ├── neutrinordp-devel-git836b738-1.el8.x86_64.rpm
│   │       ├── neutrinordp-libs-git836b738-1.el8.x86_64.rpm
│   │       ├── neutrinordp-plugins-standard-git836b738-1.el8.x86_64.rpm
│   │       ├── neutrinordp-xfreerdp-git836b738-1.el8.x86_64.rpm
│   │       ├── xrdp-0.9.20-1.el8.x86_64.rpm
│   │       ├── xrdp-debuginfo-0.9.20-1.el8.x86_64.rpm
│   │       ├── xrdp-debugsource-0.9.20-1.el8.x86_64.rpm
│   │       ├── xrdp-devel-0.9.20-1.el8.x86_64.rpm
│   │       ├── xrdp-rdpproxy-0.9.20-1.el8.x86_64.rpm
│   │       ├── xrdp-rdpproxy-debuginfo-0.9.20-1.el8.x86_64.rpm
│   │       └── xrdp-selinux-0.9.20-1.el8.x86_64.rpm
│   ├── SOURCES
│   │   ├── CMakeLists.txt.patch
│   │   ├── README.Fedora
│   │   ├── neutrinolabs-neutrinordp-836b738.tar.gz
│   │   ├── openssl.conf
│   │   ├── xrdp-0.9.10-scripts-libexec.patch
│   │   ├── xrdp-0.9.16-arch.patch
│   │   ├── xrdp-0.9.17-xrdp-ini.patch
│   │   ├── xrdp-0.9.18-vnc-uninit.patch
│   │   ├── xrdp-0.9.20-sesman-ini.patch
│   │   ├── xrdp-0.9.20.tar.gz
│   │   ├── xrdp-0.9.4-service.patch
│   │   ├── xrdp-0.9.6-script-interpreter.patch
│   │   ├── xrdp-0.9.9-sesman.patch
│   │   ├── xrdp-polkit-1.rules
│   │   ├── xrdp-sesman.pamd
│   │   ├── xrdp.logrotate
│   │   ├── xrdp.sysconfig
│   │   └── xrdp.te
│   ├── SPECS
│   │   ├── neutrinordp.spec
│   │   └── xrdp.spec
│   └── SRPMS
└── xrdp-0.9.20-1.el8.src.rpm
```

## インストール
RDP Proxyとして動作させるためには 生成されたrpmファイルのうち、以下のファイルが必要です。
```text
neutrinordp-libs-git836b738-1.el8.x86_64.rpm
xrdp-0.9.20-1.el8.x86_64.rpm
xrdp-rdpproxy-0.9.20-1.el8.x86_64.rpm
xrdp-selinux-0.9.20-1.el8.x86_64.rpm
```

インストールする際には以下のコマンドで
```bash
sudo dnf install -y neutrinordp-libs-git836b738-1.el8.x86_64.rpm xrdp-0.9.20-1.el8.x86_64.rpm xrdp-rdpproxy-0.9.20-1.el8.x86_64.rpm xrdp-selinux-0.9.20-1.el8.x86_64.rpm

# 自動起動設定を行いdaemonとして起動する。
systemctl enable xrdp
systemctl start xrdp

# Firewallで3389/tcpを受信接続できるようにする。
firewall-cmd --add-port=3389/tcp
firewall-cmd --runtime-to-permanent

```

## まとめ
RDP Proxy mode を有効にしたxrdpのrpmbuild方法をご紹介しました。


## 次回予告
debian系ディストリビューションでのbuild方法をご紹介する予定です。