alfort's Blog

Linuxエンジニアのメモ

Nextcloudのインストールとデータ置き場の変更


Nextcloud をFedora32にインストールする

Nextcloud とは

NextCloudを使うとDropBoxGoogle Driveのように、複数のマシン間で ファイル共有することができる。

https://nextcloud.com/

DropBoxGoogle Driveと異なり、自分で構築したサーバ上にファイルを置き共有するので 容量に合わせて毎月払ったりする料金の必要はない。

ということで、今回はこのNextCloudをインストールしてみた。

マシン環境

今回はFedora32 Workstation Editionをインストールしたいるサーバ上に構築した。

$ uname -a
Linux XXXXX 5.8.16-200.fc32.x86_64 #1 SMP Mon Oct 19 14:17:16 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
$ cat /etc/os-release
NAME=Fedora
VERSION="32 (Workstation Edition)"
ID=fedora
VERSION_ID=32
VERSION_CODENAME=""
PLATFORM_ID="platform:f32"
PRETTY_NAME="Fedora 32 (Workstation Edition)"
ANSI_COLOR="0;34"
LOGO=fedora-logo-icon
CPE_NAME="cpe:/o:fedoraproject:fedora:32"
HOME_URL="https://fedoraproject.org/"
DOCUMENTATION_URL="https://docs.fedoraproject.org/en-US/fedora/f32/system-administrators-guide/"
SUPPORT_URL="https://fedoraproject.org/wiki/Communicating_and_getting_help"
BUG_REPORT_URL="https://bugzilla.redhat.com/"
REDHAT_BUGZILLA_PRODUCT="Fedora"
REDHAT_BUGZILLA_PRODUCT_VERSION=32
REDHAT_SUPPORT_PRODUCT="Fedora"
REDHAT_SUPPORT_PRODUCT_VERSION=32
PRIVACY_POLICY_URL="https://fedoraproject.org/wiki/Legal:PrivacyPolicy"
VARIANT="Workstation Edition"
VARIANT_ID=workstation

構築方法

構築には色々な方法があるのだが、Snappyという パッケージマネージャをインストールして使うのが一番簡単らしい。

以下のようにしてインストールした。

また、他のPCやスマホからアクセス可能にするためにも、httphttpsで使うポートを開放する。

$ sudo dnf update
$ sudo dnf install snapd
$ sudo snap install nextcloud
$ sudo firewall-cmd --permanent --add-service=http
$ sudo firewall-cmd --permanent --add-service=https
$ sudo firewall-cmd --reload

http://<IPアドレス>にアクセスすると使えるようになっていることがわかる。

Nextcloud上のデータの置き場所を変更する

インストールして使ってみたところ、Nextcloud上においたデータは/var配下にあり、 パーティションをすでに切っている場合は容量が逼迫することがある。

そこで、ファイルの置き場所を変えてみた。

設定ファイルの編集を行えばいいだけなのだが、前後にサービスの停止、起動が必要。

snap stop nextcloud
vi /var/snap/nextcloud/24051/nextcloud/config/config.php
snap start nextcloud

以下のように、datadirectoryの場所を変更すればいいだけ。 また、24051のように数値が入るが、これはPIDなのか毎回変わるように思う。

'datadirectory' => '/home/nextcloud/common/nextcloud/data',

今回は以下のように、比較的容量に余裕のある/home配下に置くようにした

<?php
$CONFIG = array (
  'apps_paths' =>
  array (
    0 =>
    array (
      'path' => '/snap/nextcloud/current/htdocs/apps',
      'url' => '/apps',
      'writable' => false,
    ),
    1 =>
    array (
      'path' => '/var/snap/nextcloud/current/nextcloud/extra-apps',
      'url' => '/extra-apps',
      'writable' => true,
    ),
  ),
  'supportedDatabases' =>
  array (
    0 => 'mysql',
  ),
  'memcache.locking' => '\\OC\\Memcache\\Redis',
  'memcache.local' => '\\OC\\Memcache\\Redis',
  'redis' =>
  array (
    'host' => '/tmp/sockets/redis.sock',
    'port' => 0,
  ),
  'log_type' => 'file',
  'logfile' => '/var/snap/nextcloud/current/logs/nextcloud.log',
  'logfilemode' => 416,
  'instanceid' => 'oc36prog4iwt',
  'passwordsalt' => '7BuO1/+dqsVGSi9d90UimDzAoOg6WU',
  'secret' => 'QtTiQ+0J9S+CQ7a7C6AyPhZfHgxLH1Bh4piHZF3rJ14OYEN9',
  'trusted_domains' =>
  array (
    0 => 'XXX.XXX.XXX.XXX',
  ),
  'datadirectory' => '/home/nextcloud/common/nextcloud/data',
  'dbtype' => 'mysql',
  'version' => '20.0.1.1',
  'overwrite.cli.url' => 'http://XXX.XXX.XXX.XXX',
  'dbname' => 'nextcloud',
  'dbhost' => 'localhost:/tmp/sockets/mysql.sock',
  'dbport' => '',
  'dbtableprefix' => 'oc_',
  'mysql.utf8mb4' => true,
  'dbuser' => 'nextcloud',
  'dbpassword' => '_yqt4yP-nDzLDL6AwDjdGsatTPzav3lIaCAzh-Rc9B3tiKAvVizFm1LzLl9GBO4p',
  'installed' => true,
  'maintenance' => false,
  'loglevel' => 2,
);

NTPによる時刻の同期を明に行う

NTP(Network Time Protocol)による時刻の同期

ノートPCでWSL(Windows Subsystem for Linux)を使っているのだがノートPCのスリープなどを契機として時刻がずれることがある。

ノートPCとか普通のPCは、ある程度の精度で時間を測ることが可能になっているが、どうしても正確な時刻とずれてしまう。 このズレを修正するための仕組みがNTPなのだが、時刻の調整を明に行いたいことがある。

こういうときどうするのかというメモ。

続きを読む

EdgeRouterの公開鍵認証

EdgeRouterとは

業務用で高度な設定が可能なルータといえばCiscoヤマハが有名だが、とんでもなく高い。

そこで私はEdgeRouterというルーターを使っている。

www.ui.com

日本語に対応してないので英語で情報収集ができないといけない(もちろん、EdgeRouterを使っている人なら誰でも見たことがある以下のようなブログとかはすごく参考になる)とか、 あんまり情報がないというのはあるのだが、安い。

yabe.jp

一番安価なモデルであるEdgeRouter Xだと、1万ぐらいで購入できたりする。

www.ui.com

何をするのか

このルータ、SSHでログインして端末から操作できたりするのだがその認証が公開鍵認証とパスワード認証でログインできる。 一応外部からもアクセスするルーターなので公開鍵認証のみ使えるようにしようと思って調べたのでまとめる。

続きを読む

Fedoraのかんたんなアップデート

背景

Fedoraを使っていると半年に1回程度はアップグレードされるので追従するのが非常に大変である。

以前以下のような記事を書いたものの、ここを見ながらOSのアップグレードを行うのが煩わしいなと思ってしまった。

alfort728.hatenablog.com

今回はこのアップグレードを簡単に行うようにスクリプトを作ってみた。

続きを読む

dnf updateの自動化

Fedoradnf update

Fedoraを使っていると、dnf updateした際にしょっちゅうパッケージの更新がある。

できるだけ新しいものがインストールされるように、なので、自動でアップデートが走るようにしてみた。

続きを読む

Chromium OS セットアップ(Hostname編)

Chromium OSのセットアップ

余っているネットブックがあったので、これにChromium OSを入れてみて、ある程度使えるようにするまでのセットアップなどをメモする。

まずはHostnameを変えた。

続きを読む

`su(1)`できないマシンで四苦八苦した話

su(1)が使えない

ちょっとしたことでマシンが不調になり、su(1)ができなくなったときにやってみた知見をまとめた。

再現させて見たけれども、最悪の場合どうしようにもなくなってしまう可能性があるので、壊してもいい環境で遊んでいる。

何が起こったか

su(1)で実行するのに必要なライブラリがみつからなくなってしまった。

$ su -
su: error while loading shared libraries: libaudit.so.1: cannot open shared object file: No such file or directory

で、libaudit.so.1を探してみると、以下のように誰かが名前を書き換えて、libaudit.so.1を消してしまった(ここではlibaudit_dymmy.so.1に書き換えてしまった)らしい。。。

ll /lib/x86_64-linux-gnu/ |grep libaudit
-rw-r--r--  1 root root   133200  8月 16 15:37 libaudit.so.1.0.0
lrwxrwxrwx  1 root root       17 10月 19 01:07 libaudit_dummy.so.1 -> libaudit.so.1.0.0

マシン環境など

$ less /etc/os-releaseしてみた結果は以下の通り。 Hyper-Vで立ち上げた仮想マシンで、最悪の場合完全に復旧不可能になってしまうため、チェックポイントを立ててバックアップはとっている。

NAME="Ubuntu"
VERSION="19.10 (Eoan Ermine)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 19.10"
VERSION_ID="19.10"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=eoan
UBUNTU_CODENAME=eoan

どうやって対応するか

よくみると、libaudit.so.1.0.0自体は無傷でlibaudit.so.1が見つからなくなってしまっているように見える。

libaudit.so.1.0.0はライブラリの実態で、ここを書き換えられるとどうしようにもないけれど、libaudit.so.1は単なるシンボリックリンクに過ぎない。

といったことを考えた。

シンボリックリンクを張る

こんな感じで、適当な場所にシンボリックリンクを張る。 今回は一般ユーザのホームディレクトリ直下に張ってみた。

$ ln -s /lib/x86_64-linux-gnu/libaudit.so.1.0.0 libaudit.so.1
$ ls
ダウンロード  デスクトップ  ビデオ    ミュージックlibaudit.so.1  テンプレート  ドキュメント  ピクチャ  公開

シンボリックリンクを見るようにする

環境変数LD_LIBRARY_PATHLD_PRELOADを使ってなんとかならないかやってみた。

LD_LIBRARY_PATHを使う

環境変数LD_LIBRARY_PATHを使うことで、バイナリ実行時に動的ライブラリを探索するパスを追加することが可能になる。

以下のように、libaudit.so.1が見つからなかったのが、見つかるようになったので動くようになるはずなのだが、やっぱり動かない。

$ ldd /bin/su
        linux-vdso.so.1 (0x00007fe4ee3b9000)
        libpam.so.0 => /lib/x86_64-linux-gnu/libpam.so.0 (0x00007fe4ee37f000)
        libpam_misc.so.0 => /lib/x86_64-linux-gnu/libpam_misc.so.0 (0x00007fe4ee37a000)
        libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007fe4ee375000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fe4ee184000)
        libaudit.so.1 => not found
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fe4ee17e000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fe4ee3ba000)
$ export LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH
$ ldd /bin/su
        linux-vdso.so.1 (0x00007ffe16fd6000)
        libpam.so.0 => /lib/x86_64-linux-gnu/libpam.so.0 (0x00007f1c13374000)
        libpam_misc.so.0 => /lib/x86_64-linux-gnu/libpam_misc.so.0 (0x00007f1c1336f000)
        libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007f1c1336a000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f1c13179000)
        libaudit.so.1 => ./libaudit.so.1 (0x00007f1c1314d000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f1c13147000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f1c133ab000)
        libcap-ng.so.0 => /lib/x86_64-linux-gnu/libcap-ng.so.0 (0x00007f1c1313d000)
$ su -
su: error while loading shared libraries: libaudit.so.1: cannot open shared object file: No such file or directory

LD_PRELOADを使う

環境変数 LD_PRELOADを使うことで、動的ライブラリの関数を置き換えることができる。

こっちを使ってみても、やっぱり動かない。

$ LD_PRELOAD=./libaudit.so.1 su -
su: error while loading shared libraries: libaudit.so.1: cannot open shared object file: No such file or directory

なんで?

セキュリティ的なものが原因で、su(1)のようなコマンドでは、LD_LIBRARY_PATHLD_PRELOADが無効にされてしまうらしい。

www.ipa.go.jp

悪意のあるユーザがLD_LIBRARY_PATHLD_PRELOADを使って認証を回避してしまうようなライブラリによる差し替えを行うことを防ぐためらしい。

もちろん、PATHなどを置き換えることもできないらしい。

まぁ言われてみればそれはそうか。。。となるけれど、セキュアなプログラミングはきちんと身につけておきたい。。。