LinuxからWindowsのWebDAVをマウントする

# はじめに

RHEL7.0からWindowsServer2019のhttpsなWebDAV(IIS)に、ADユーザでWebDAVマウントできる環境を作った際に少し苦労したのでメモります。

## 参考にしたサイト
https://www.hiroom2.com/2018/05/16/fedora-28-davfs2-ja/
https://rougeref.hatenablog.com/entries/2006/11/16
https://tabuyan.blog.ss-blog.jp/2009-07-04

## 環境
 - WebDAVクライアント
    - RHEL7.0
 - WebDAVサーバ
    - WindowsServer2019 + IIS ver.10 (WebDAV+Windows認証有効化)
       - AD参加済み

## 経緯

- LinuxからWebDAVをマウントするにはdavfs2というOSSを利用します。

https://savannah.nongnu.org/projects/davfs2

- davfs2の最新版は1.6.0です(2021/10/2現在)。
 - RHEL7.0用のrpmは探し方が悪いのか、1.4.7系のものしか見つけられませんでした。

https://rpmfind.net/linux/rpm2html/search.php?query=davfs2

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538058/7a87caa8-389e-80e0-db22-61f9ee93e2dd.png)

- 最初は上記の1.4.7系のrpmであれこれ試していたのですが、***バージョン1.4.7では[trust_server_cert]というオプションに対応していない***ことに気づきました。
  - [trust_server_cert]は、その名の通り信頼するサーバ証明書のパスを指定するオプションで、httpsの警告を回避するためのものです。
接続先のWebDAVがhttpsで構成されていて、かつサーバ証明書のCAをクライアント側で参照できない場合（つまり企業内のプライベートドメインでCAがどこにあるかわからない場合など）に、あらかじめサーバ証明書を取得しておくことで、マウント時の警告が回避できます。

- 証明書を取り込むのではなく、単に警告を回避するオプションがあれば嬉しかったのですがそんなオプションは無いようです。
  -  上記参考サイトにも警告を回避するためにソースコードをいじっている方もおられました。(そういうアプローチ嫌いじゃない)

ということで良いrpmがないのでソースインストールすることにしました。


# WebDAVサーバの準備(Windows)

- IISインストール、WebDAV有効化、Windows認証の設定については省略します。
- ドメインにも参加させ、必要なWebDAVの仮想サイトの[WebDAVオーサリング規則]にAD認証させるユーザまたはグループを登録しておきます。
- Linuxクライアントに入れるdavfs2自体は特定のバージョン以上(※1)であればWindowsのKerberos認証に対応しているのですが、***WindowsのGPOでNTLMv2を強制させるケースがあります***(※2)。その場合はIIS側で基本認証(=BASIC認証)を有効化する必要があります(※3)。
  - ※1. davfs2が参照するneonライブラリが0.29以上
     - 実際にはKerberos認証周りはNeonが利用するGSS-APIが担う。そのためこのへんはデバッグが非常に辛い。
  - ※2. この場合はdavfs2からのkerberos認証ができない。
  - ※3. WebDAVがhttps等で暗号化されている、またはインターネットを経由しないかつ安全な通信経路、といった条件が前提になります。

- 基本認証を有効化していない状態でmountコマンドを実行した場合のエラー出力は以下の通りです。

```
/sbin/mount.davfs: Mounting failed.
Could not authenticate to server: ignored NTLM challenge, GSSAPI authentication error: Unspecified GSS failure.  Minor code may provide more information: No Kerberos credentials available
```

- 上述のようなケースでは、Windows側で以下のように適切な階層で基本認証を有効化し、IISの停止・起動を実施します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538058/4934fb0a-961c-b86f-251c-80db4a8e07f4.png)


# WebDAVクライアントの準備(Linux)

- OSのセットアップは省略します。
- なお、本環境はAWSのEC2の以下イメージで作成しているため、gccすら入っていません。なので手順上でgcc等をインストールしています。
 - ami-35556534

```
# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.0 (Maipo)
```

## davfs2のインストールおよび設定

### neonのインストール

- davfs2の1.6.0は、neon最新の0.32系に対応していないため、neonは0.31系を入れます。
 - https://notroj.github.io/neon/

- SSLに対応させるため、openssl-develを入れ、configureオプションでもそれを指定しています。
- XML系ライブラリについて
  - libxml2-devel はneonのconfigureに失敗するため入れました。
  - xmlto はneonのmake installに失敗するため入れました。(ドキュメント生成の出力ですかね？)

```
########################### neon install ( for davfs2 )
# yum install -y gcc
# yum install -y libxml2-devel
# yum install -y xmlto
# yum install -y openssl-devel

###  SSH session may expire during installation.
###  Reconnect and check if it is installed with the following command, and if not, re-execute.
# rpm -qa | grep openssl-devel

# cd /usr/local/src/
# wget https://notroj.github.io/neon/neon-0.31.2.tar.gz
# tar xzvf neon-0.31.2.tar.gz
# cd neon-0.31.2
# ./configure --with-ssl=openssl --enable-shared
# make
# make install
```

### davfs2のインストール

 - configureオプションでneonのライブラリパスを指定しています。

```
# cd /usr/local/src/
# wget http://download.savannah.nongnu.org/releases/davfs2/davfs2-1.6.0.tar.gz
# tar xzvf davfs2-1.6.0.tar.gz
# cd davfs2-1.6.0/
# ./configure --with-neon=/usr/local/
# make
# make install
```

### davfs2の設定

 - OS起動時の自動マウントに対応させるため、ユーザ名とパスワードをsecretsファイルに記載しています。
 - 証明書警告を避けるため、サーバ証明書をダウンロードし、davfs2.confに[trust_server_cert]として指定しています。
   - なお、***[trust_server_cert]行が複数ある場合は、最終行しか参照されないようです。***
      - カンマ区切りは未対応でした。
      - 1つのpemファイルに複数の証明書を入れてdavfs2.confで指定した場合も、pem内の最初のcertしか有効化されませんでした。
         - ソース書き換えたいところですが、今回は1ドメインしか利用しないので気にしないことにします。

```
# cd /usr/local/etc/davfs2/
# cp -p /usr/local/etc/davfs2/secrets{,.`date +"%Y%m%d"`}
# vi /usr/local/etc/davfs2/secrets

(add)
https://(yourdomain)/(service-path) (username) (password)

(check)
# cat /usr/local/etc/davfs2/secrets | grep  -v -e ^# -e ^$

# cp -p /usr/local/etc/davfs2/davfs2.conf{,.`date +"%Y%m%d"`}
# WEBDAV_SERVER_FQDN=(yourdomain)
# openssl s_client -showcerts -connect ${WEBDAV_SERVER_FQDN}:443 < /dev/null 2> /dev/null | openssl x509 -outform PEM | tee /usr/local/etc/davfs2/certs/${WEBDAV_SERVER_FQDN}.pem

# echo "trust_server_cert ${WEBDAV_SERVER_FQDN}.pem" | tee -a /usr/local/etc/davfs2/davfs2.conf

```

# 運用

### マウント

```
# mount -t davfs https://(yourdomain)/(service-path) (mountpoint)

(check)
# ls -altr (mountpoint)
```

### OS起動時自動マウント

- fstabはマウントのresumeはしてくれないため、Linux OS起動時にwebdavが落ちている場合はマウントできないことをご留意ください。
  -  resumeもできるオートマウントを使いたい場合はautofs等を検討してください。


```
# cp -p /etc/fstab{,.`date +"%Y%m%d"`}
# vi /etc/fstab

(add)
https://(yourdomain)/(service-path) (mountpoint) davfs _netdev,x-systemd.automount 0 0

(check)
## Confirm that it is automatically mounted after restarting the OS
```

以上です。