Linux 設定日記

設定したことを忘れないように書いてあります。

2023.08.14
clamdscanをrootで実施しているのに、Access deniedやParmission denidのログが残る。

ここを参考に、/etc/cron.daily/clamdscanを修正。

--- /etc/cron.daily/clamdscan.orig      2023-08-15 09:15:11.496374765 +0900
+++ /etc/cron.daily/clamdscan   2023-08-15 09:05:23.429737649 +0900
@@ -5,7 +5,7 @@
 CLAMSCANLOG=`mktemp`
 QUARANTINEDIR=/tmp/clamdscan-quarantine-$(date +%Y%m%d)
 mkdir -p ${QUARANTINEDIR}
-clamdscan -c ${CONFIG} --move=${QUARANTINEDIR} / > ${CLAMSCANLOG} 2>&1
+clamdscan -c ${CONFIG} --move=${QUARANTINEDIR} -fdpass / > ${CLAMSCANLOG} 2>&1

 # ウイルス検知時、root宛にメール通知
 if [ -z "$(grep FOUND$ ${CLAMSCANLOG})" ]; then

追加したのは、fdpathオプション。このオプションは、manによると、

    --fdpass
        ファイルディスクリプタの権限をclamdに渡します。
        これは、clamdが異なるユーザーとして実行されている場合に役立ちます。
        ファイルをclamdにストリーミングするよりも高速です。local(unix)ソケット経由でclamdに接続されている場合にのみ使用可能です。

元ネタは英文だったので、ChatGPTに翻訳してもらった。

2023.08.13
systemd メッセージ (Created slice, Starting Session) でログがいっぱいになる

redhatの公式Kkowledgebaseにある通りではあるが、それだけでは足りなかったので。
一通りRedhatのナレッジの通りやった後、以下を追加。

/etc/rsyslog.d/ignore-systemd-session-slice.confに下線部を追加。
if $programname == "systemd" and ($msg contains "Starting Session" or $msg contains "Started Session" or $msg contains "Created slice" or $msg contains "Starting user-" or $msg contains "Starting User Slice of" or $msg contains "Removed session" or $msg contains "Removed slice User Slice of" or $msg contains "Stopping User Slice of" or $msg contains ".scope: Succeeded.") then stop

一応念のため、redhat公式にあるtestuserは、以下のような実際にログを参照して、それぞれUIDのユーザ名に、user@1000.service.dの1000の部分はログに残っているUIDに読み替えが必要です。

Starting User Manager for UID 1001...

ついでに、clamdのSelfCheck: Database status OK.も大量に出るので、rsyslogdで抑止。 以下の内容で/etc/rsyslog.d/ignore-clamd-session.confを作成して、rsyslogdを再起動。

if $programname == "clamd" and ($msg contains "SelfCheck: Database status OK.") then stop
2023.03.24
httpのログに“client denied by server configuration” errorが出るときの直し方

原因は、Apache2.4 から権限の記述法が変更になったため。以下のように直す。

2023.03.23
rainloopの認証をotp化したら何度も再認証が要求される

rainloopで自サーバにためたメールを外からみれるようにした。 認証として、mod-auth-otpを使用して、rainloopのディレクトリに対してotpでの認証をするようにした。 最初は問題無かったが、5分ほどたつと再認証を要求される。

最初はrainloopがキャッシュフォルダを作成すると、そのフォルダに対して再度認証が発生するのかと思い、認証対象をphpとhtmlに限定してみたが、状況は変わらない。 apacheのログをみると、

[Thu Mar 2 20:45:28.673569 2023] [:error] [pid 2308149:tid 140698380637952] [client 192.168.107.2:57102] can't new open OTP users file "/etc/httpd/conf.d/users.otp.new": Permission denied, referer: XXXXX
[Thu Mar 2 20:45:34.860612 2023] [:notice] [pid 2308149:tid 140697961232128] [client 192.168.107.2:57110] user "XXXX" provided the wrong OTP (2 consecutive), referer: XXXX

のようなエラーメッセージが出ていた。 users.otpのファイルには、apahceからのアクセス権があるが、ディレクトリに対してはないため、新しいファイルが作成できないようだ。 エラーメッセージで検索すると、githabに 「Authentication should fail if users file is not writable (but is readable)#26」というスレッドがあり、 以下のコマンドでユーザログインの認証の更新を確認するように指示があった。 確認した結果、構築時に認証した時間から更新されていないようだった。

    # watch -d cat /etc/httpd/conf.d/users.otp

users.otpファイルを置くディレクトリを変更し、そのディレクトリに対して、apacheユーザからの書き込み権限を許可したところ、事象が改善したように見える。

2023.01.31
mdadmソフトウェアRAIDが、initramfsステージの起動時に再構築されない(おそらく解決)

grub -> initramfs移行時にraidが再構築されずに、Emergency mode になってしまう事象は、 おそらく起動時のドライブ構成が変わってしまうことが原因とおもわれる。 おそらくと記述したのは、原因が違って再起動できなかったら面倒なので、確かめていないから。

とりあえず、mdadm.confをデバイス指定ではなく、path指定にしてinitramfsを再構築した。

2022.05.05
mdadmソフトウェアRAIDが、initramfsステージの起動時に再構築されない

rocky linuxに移行したところ、再起動で起動しなくなった。その時はリカバリを行い、何とか起動できるようになったが、その時の直し方が悪かったのか その後ブレーカーダウンでサーバが落ちたときに起動できなくなった。

同じように復旧をさせてみたのだが、何度トライしてもgrub -> initramfs移行時にraidが再構築されずに、Emergency mode になってしまう。

その状態でraidを再構築すれば、正しく構築できるので理由がまったくわからなかった。

2021.08.19
Jupiter Notebookにライブラリを追加する

先日入れたJupiter notebookのコンテナには、MySQLdbが入っていなかった。 追加でmysql-clientをインストールしようとしたが、下のようなWARNINGやらERROR等が出てモジュールがインストールできない。

  sudo docker exec -i -t jupyter /bin/bash
  :~$pip install mysqlclient
  Collecting mysqlclient
   Using cached mysqlclient-2.0.3.tar.gz (88 kB)
     ERROR: Command errored out with exit status 1:
      command: /opt/conda/bin/python3.9 -c 'import io, os, sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-zttme2ar/mysqlclient_1fce57df4c9d413491a46cf10d2f3e28/setup.py'"'"'; __file__='"'"'/tmp/pip-install-zttme2ar/mysqlclient_1fce57df4c9d413491a46cf10d2f3e28/setup.py'"'"';f = getattr(tokenize, '"'"'open'"'"', open)(__file__) if os.path.exists(__file__) else io.StringIO('"'"'from setuptools import setup; setup()'"'"');code = f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base /tmp/pip-pip-egg-info-6yvw5jt2
          cwd: /tmp/pip-install-zttme2ar/mysqlclient_1fce57df4c9d413491a46cf10d2f3e28/
     Complete output (15 lines):
     /bin/sh: 1: mysql_config: not found
     /bin/sh: 1: mariadb_config: not found
     /bin/sh: 1: mysql_config: not found
     Traceback (most recent call last):
       File "", line 1, in 
       File "/tmp/pip-install-zttme2ar/mysqlclient_1fce57df4c9d413491a46cf10d2f3e28/setup.py", line 15, in 
         metadata, options = get_config()
       File "/tmp/pip-install-zttme2ar/mysqlclient_1fce57df4c9d413491a46cf10d2f3e28/setup_posix.py", line 70, in get_config
         libs = mysql_config("libs")
       File "/tmp/pip-install-zttme2ar/mysqlclient_1fce57df4c9d413491a46cf10d2f3e28/setup_posix.py", line 31, in mysql_config
         raise OSError("{} not found".format(_mysql_config_path))
     OSError: mysql_config not found
     mysql_config --version
     mariadb_config --version
     mysql_config --libs
     ----------------------------------------
 WARNING: Discarding https://files.pythonhosted.org/packages/3c/df/59cd2fa5e48d0804d213bdcb1acb4d08c403b61c7ff7ed4dd4a6a2deb3f7/mysqlclient-2.0.3.tar.gz#sha256=f6ebea7c008f155baeefe16c56cd3ee6239f7a5a9ae42396c2f1860f08a7c432 (from https://pypi.org/simple/mysqlclient/) (requires-python:>=3.5). Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.
   Using cached mysqlclient-2.0.2.tar.gz (88 kB)
   :

webで調べると、libmysqlclient-devとpython3-devをインストールしたらインストールできたとの事なので、rootでコンテナに入り追加する。

$ sudo docker exec -i -u root -t 17888e7ab0a0 /bin/bash 
:~# apt-get update
:~# apt-get -y libmysqlclient-dev python3-dev
:~#

再度インストールすると、gccが無いというメッセージが出るので、同様にgccもインストール

:~# apt-get -y install gcc

このまま、sudo su - jovyanとしてpipインストールしようとするが、pipにパスが通っていない。 なので、いったんコンテナから抜けて、入り直してインストール。

$ sudo docker exec -i -t 17888e7ab0a0 /bin/bash 
:~$ pip install mysqlclient
Collecting mysqlclient
  Using cached mysqlclient-2.0.3.tar.gz (88 kB)
Building wheels for collected packages: mysqlclient
  Building wheel for mysqlclient (setup.py) ... done
  Created wheel for mysqlclient: filename=mysqlclient-2.0.3-cp39-cp39-linux_x86_64.whl size=60658 sha256=137ef154399e4dbd36018340ae5fbaa103076a8edec9ae8b437a0f18cb8d643c
  Stored in directory: /home/jovyan/.cache/pip/wheels/43/55/d9/a2243d4b624c18c5cba30bf88e0521147498368068cb302532

インストール成功。notebook上で、import MySQLdbしてもエラーとならなくなった。

2021.08.16
Jupyter notebookをdockerで構築する

phthonを勉強しはじめたが、Windowsマシンからlinux上にコンソールでログインしていると、 グラフィカルな表示ができない。Windows上でpython環境を作るか、X-ClinentをWindows側に 用意するかすれば良いのだろうが、いまさら感があり、jupyter notebookをサーバ上に構築することとした。

サーバ上に直接Jupyter Notebookを構築してもよかったが、せっかくDockerを作成したので、Docker上に作成することとした。

インストール

インストールは以下のコマンド一発で完了。

~]$ mkdir Jupyter && cd ~/Jupyter
Jupyter]$ sudo docker run -v `pwd`:/home/jovyan/work -p 1888:8888 --name jupyter jupyter/scipy-notebook

イメージは、jupyter/scipy-notebookを指定。ローカルに無い場合は勝手にgithubから取得してくる。 今回は、

  1. -v `pwd`:/home/jovyan/work で docker内の/home/jovyan/workディレクトリを、ホスト側の~/Jupyterにバインド
  2. Docker側の ポート:8888 を ホスト側で開いている 1888に バインド

した。インストール時に、

Jupyter Notebook 6.4.2 is running at:
http://17888e7ab0a0:8888/?token=be59e175207c15b9c95a17791445614c75b0f1b92c22980d

と表示されるtokenをログイン時に使用するので控えておく(ただし、私の場合はこのトークンではログインできなかった)。

ログオン画面で、tokenに先程のトークンを指定すれば、ログオンできるはずだが、なぜかエラーとなった。 なので、コンテナ内に入って、トークンを確認。?token以下を入力することでログオンが可能になった。

~]$ sudo docker exec -i -t jupyter cat  /home/jovyan/.local/share/jupyter/runtime/nbserver-7-open.html
(base) jovyan@17888e7ab0a0:~$ cat .local/share/jupyter/runtime/nbserver-7-open.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="refresh" content="1;url=http://0.0.0.0:8888/tree?token=987654321abcdef987654321abcdef987654321abcdef98" />
    <title>Opening Jupyter Notebook</title>
    <script>
      setTimeout(function() {
        window.location.href = "http://0.0.0.0:8888/tree?token=987654321abcdef987654321abcdef987654321abcdef98";
      }, 1000);
    </script>
</head>
<body>

<p>
    This page should redirect you to Jupyter Notebook. If it doesn't,
    <a href="http://0.0.0.0:8888/tree?token=987654321abcdef987654321abcdef987654321abcdef98">click here to go to Jupyter</a>.
</p>

</body>
</html>

ホスト側アカウントの設定とホームディレクトリのパーミッション設定

コンテナとバインドしたディレクトリへの書き込みは、コンテナ上のアカウントのuidで行われるため、 ホスト側にも同じuidのアカウントを作成する。
コンテナ上のuidを確認して、同じuidでホスト側にユーザを作成する。 uidがかぶっていて、そのユーザがこの用途に使えない場合はコンテナ側のuidの変更が必要だろうが、その必要はなかった。

~]$ sudo docker exec -i -t jupyter cat /etc/passwd | grep jovyan
jovyan:x:1000:100::/home/jovyan:/bin/bash
~]$ sudo adduser --uid 1000 jovyan

自分とjovyanをグループに追加し、SGIDビットを立てて、対象ディレクトリにグループへの書き込み権限を与える。

~]$ cd ~/Jupyter
Jupyter]$ sudo usermod  -aG dkrusers my_account
Jupyter]$ sudo usermod  -aG dkrusers jovyan
Jupyter]$ sudo chmod 2775 .