Debian 10 (buster)のApache 2.4でSuexec

はじめに

Debian 10 のインストールはDebian 10 (buster)を用いたサーバ設定メモ - 発声練習
Debian 8での場合はDebian/GNU Linux WheezyでSuexec - 発声練習

方針

  • パッケージを使って構築する
  • 研究室共用ページはドキュメントルートに
  • 個々人のページは/home/USER/public_html以下に
  • CGIをSuExecで許す
  • SSIも許す

Apache2のインストール

apache2-suexecだとドキュメントルートとユーザディレクトリを変更できない。そこで、apache2-suexec-customを利用する

% sudo aptitude install apache2-suexec-custom

/etc/apache2/suexec/www-data を編集し、ドキュメントルートとユーザディレクトリを変更する。

% cd /etc/apache2/suexec/
% sudo cp -p www-data www-data.org
% sudo vi www-data

編集結果は以下のとおり

% diff www-data.org www-data
2c2
< public_html/cgi-bin
---
>public_html

ユーザディレクトリの部分を変更。

SuExecを有効にする。

% sudo a2enmod suexec
% sudo systemctl restart apache2

DebianやUbuntuのApacheの設定

/etc/apache2で設定する。各種設定ファイルが sites-avaiable か mods-avaiable にあり、これを a2ensite, a2enmod, a2dissite, a2dismodのコマンドでこれらの設定ファイルを sites-enabledかmodts-enabled にシンボリックリンクする。これにより、選択された設定がApacheへ反映される。

設定ファイルを変更したり、siteやmodを付け加えた場合はApacheを再起動する。

% sudo /etc/init.d/apache2 restart

DocumentRootの設定

/etc/apache2/sites-available/default を編集する。

% cd /etc/apache2/sites-available/
% sudo cp -p default default.org
% sudo vi default

編集結果は以下のとおり

% diff default.org default
< 		Options Indexes FollowSymLinks MultiViews
< 		AllowOverride None
---
> 		Options ExecCGI MultiViews SymLinksIfOwnerMatch IncludesNoExec
> 		AllowOverride All
16,22c16,22
< 	ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
< 	<Directory "/usr/lib/cgi-bin">
< 		AllowOverride None
< 		Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
< 		Order allow,deny
< 		Allow from all
< 	</Directory>
---
> 	#ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
> 	#<Directory "/usr/lib/cgi-bin">
> 	#	AllowOverride None
> 	#	Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
> 	#	Order allow,deny
> 	#	Allow from all
> 	#</Directory>

方針

  • DocumentRootは管理者しかいじらないので、.htaccessでの設定はすべて許可に(AllowOverride All)
  • CGIやSSIもDocumentRootで使うのでcgi-binの設定はコメントアウト
  • DocumentRootのOptionsは以下のとおり(参考:Apache2.2ドキュメントOptions
    • Indexesは外す(ディレクトリの中身が見えるのは良くない)
    • CGI許可:ExecCGI
    • MultiViews
    • シンボリックリンクはオーナーが一緒の場合だけ許す:SymLinksIfOwnerMatch
    • SSIを#exec コマンド と #exec CGI を除き許可: IncludesNoExec
% sudo a2enmod includes
% sudo a2enmod cgid
% sudo systemctl restart apache2

ユーザディレクトリ

/etc/apache2/mods-available/userdir.confを編集

% cd /etc/apache2/mods-available/
% sudo cp -p userdir.conf userdir.conf.org
% sudo vi userdir.conf

編集結果は以下のとおり。

% diff userdir.conf.org userdir.conf
7,15c7
<                 Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
<                 <Limit GET POST OPTIONS>
<                         Order allow,deny
<                         Allow from all
<                 </Limit>
<                 <LimitExcept GET POST OPTIONS>
<                         Order deny,allow
<                         Deny from all
<                 </LimitExcept>
---
>                 Options ExecCGI MultiViews SymLinksIfOwnerMatch IncludesNoExec
  • AllowOverrideはデフォルトのまま(「FileInfo AuthConfig Limit Indexes」の上書きOK。Optionsの上書きは許さない)
  • Limitは別にしなくて良いと思ったので削除(各自でやればよい)
  • OptionsはIndexesを外し、ExecCGIを追加
% sudo a2enmod userdir
% sudo systemctl restart apache2

.cgiの拡張子でCGIスクリプトが動くようにする

/etc/apache2/mods-available/mime.conf を編集する。

% cd /etc/apache2/mods-available/
% sudo cp -p mime.conf mime.conf.org
% sudo vi userdir.conf

編集結果は以下のとおり。

# diff mime.conf.org mime.conf
218c218
< #AddHandler cgi-script .cgi
---
> AddHandler cgi-script .cgi
244c244
< AddOutputFilter INCLUDES .shtml
---
> AddOutputFilter INCLUDES .shtml .html
  • 拡張子が.cgiならばCGIスクリプトとして処理する
  • SSIを有効にする拡張子として、.shtml と .htmlを指定する

Digest認証を有効にする

Digest認証を利用するためには、auth_digestモジュールを有効化する必要がある。

% sudo a2enmod auth_digest
% sudo systemctl restart apache2

関連:Apache 2.4のアクセス制御記述例メモ - 発声練習

Debian 8上でバックアップしたWordPressをDebian 10上でリストアするメモ

はじめに

Debian 8 (jessie)で運用していたWebサーバが故障した。幸いハードディスクのデータは無事だった。新しいWebサーバを Debian 10 (buster)上で復旧したい。

2019年11月13日の状況

うまくいきませんでした。

Debian 8 上の構成

  • WordPress 5.2.4
  • MariaDB 10系

バックアップの状況

  • Apacheの設定ファイルはまるごと残っている(/etc 以下がまるまるある)
  • WordPressの方は設置したディレクトリごとデータがある。
  • MariaDBの方はデータディレクトリはある(/var/lib/mysql)。ただし、ダンプしたSQLファイルがない。

Debian 10のインストール

以下のとおり。インストール時に「Webサーバ」「SSHサーバ」を選んでいるのでApacheはインストール済み。

MariaDBのインストール

% sudo apt install mariadb-server mariadb-client

データファイルからのデータベースの復元(frm, idbファイルからの復元)

2019年11月13日現在、うまくいっていないけれども。とりあえず調べた範囲をメモ。

MySQL InnoDB lost tables but files exist - Super Userの回答によると、MySQL/MariaDBではデータファイルをコピーするだけではデータベースの復元ができない。

バックアップをとったデータベースのデータファイルが ~/my_dbにあるとする。 あるテーブルmy_tableのデータファイルはmy_table.frm, my_table.idbとしてバックアップされているとする。

~/my_db
   |---- my_table.frm
   |---- my_table.idb

多くのページでMySQL Utilitiesに含まれる mysqlfrm を用いて、frmファイルからテーブル作成のSQL文(CREATE TABLE)を取得する手順が紹介されていたが、Debian 10のPython 2.7.16では、mysqlfrmがうまく動かなかった(バックアップをとっていたfrmファイルが悪いのか、メンテナンスが終わっているので現在のpythonのバージョンが合わないのかわからない)。

Debian 10では mariadbをインストールするとデータファイルは /var/lib/mysql 以下にある。

まず、mysql上でmy_dbデータベースを作成する。mysqlの初期パスワードは”mysql”

% mysql -u root -p
> CREATE DATABASE my_db;
> SHOW DATABASES;
> quit

すると、/var/lib/mysql/my_db というディレクトリが作成される。

つづいて、復元したいテーブルを作成する。なお、私の場合は単にテーブルを作成しただけだと、MariaDB: InnoDB File-Per-Table Tablespaces #Differing ROW_FORMAT Valuesを原因として、「ALTER TABLE tablename IMPORT TABLESPACE;」を実行すると「ERROR 1808 (HY000): Schema mismatch (Expected FSP_SPACE_FLAGS=0x21, .ibd file contains 0x0.)」というエラーがでてインポートできなかった。このため、テーブルを作成するときにROW_FORMATを指定して上げる必要があった。

参考

For anyone else that comes's across the ROW_TYPE_DYNAMIC issue like I just did. You'll have to start the process over from beginning and on your create table statements add ROW_FORMAT=COMPACT after ENGINE=InnoDB so it looks like ) ENGINE=InnoDB ROW_FORMAT=COMPACT DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci for example. Then repeat the steps like normal and it should work. – Jeff Wilbert Aug 23 at 7:49

以下のようにする。なお、テーブルの内容は適当に指定した。

% mysql -u root -p my_db
> SHOW TABLES; (何も表示されない)
> CREATE TABLE my_table (id int) ENGINE=InnoDB ROW_FORMAT=COMPACT;
> SHOW TABLES;

この時点で/var/lib/mysql/my_db以下にmy_table.frm, my_table.idbが生成される。次に作成された空のmy_table.idbを削除する。

> ALTER TABLE my_table DISCARD TABLESPACE;
> quit

バックアップをとっていたmy_table.idbを/var/lib/mysql/my_db以下にコピーする。

% sudo cp -p ~/my_db/my_table.idb /var/lib/mysql/my_db
% sudo chown mysql:mysql /var/lib/mysql/my_db/my_table.idb

インポートする。

% mysql -u root -p my_db
> ALTER TABLE my_table IMPORT TABLESPACE;
> SELECT * FROM my_table LIMIT 10;

2019年11月13日現在、テーブル1つについてはちゃんとインポートできたのだが、その後、別のテーブルをCREATE TABLEで作成しようとするとすでに存在するという主旨のエラーがでて、うまく進まなくなった。

手を動かす重要性がわかる事例:二郎判別botからくずし字判定へ

以下のニュースを読んでいるときに「あれ、この人って?」となった。
www3.nhk.or.jp

コンペでは海外のチームが上位を占める中、1人で開発にあたった福岡県の土井賢治さんが3位に入賞しました。

土井さんはIT企業のエンジニアで、ネットオークションに出品された商品が本物か偽物かを投稿された画像から判断するシステムの構築に携わっています。

また、趣味でもSNSに投稿されたラーメンの画像がどこの店舗で出されたものかを数万枚の画像データをもとに予測するシステムを運営していて、日々の仕事や趣味で培った手法を応用してくずし字の特徴を見極める精度を上げていったということです。

機械学習でラーメン?

www.slideshare.net

www.itmedia.co.jp

 「画像を見ても違いが分からなかった」――と、開発者・NTTコムウェアの土井賢治さん。土井さんの同僚が、ラーメン二郎4店舗の画像を自動識別する技術を作ったことがきっかけで、全店舗に対応した判別器を作ろうと思い立ったという。

 土井さんは、普段の業務ではディープラーニングなどの機械学習を使い、道路の不具合検出システムを開発している。今回の判別器は、その経験を生かし、趣味で開発したという。

Yahoo!ジャパンに転職したとのこと
techplay.jp

withnews.jp

面白い。

Debian 10 (buster)を用いたサーバ設定メモ

Debian 10 (buster)を使ってサーバを構築した際のメモ。

バージョンの確認方法

$ more /etc/debian_version 
10.1

$ uname -a
Linux ホスト名 4.19.0-6-amd64 #1 SMP Debian 4.19.67-2+deb10u1 (2019-09-20) x86_64 GNU/Linux

/etc/apt/sources.list を編集する

contoribとnon-freeを追加する。また、私はaptitudeが好きなのでインストールする。

% su
# apt-get update
# apt-get upgrade

sudoのインストール

標準で入れておいて欲しいくらい。

% su
# apt install sudo
# visudo
# /usr/sbin/visudo

visudoでsudoを使えるユーザを設定する。

/etc/apt/source.listの修正

Debian Wiki: SourcesListを参考にして編集する。具体的には mainに加えて、contribとnon-freeを追加する。

% sudo cp -p /etc/apt/source.list /etc/apt/source.list.org
% sudo vi /etc/apt/source.list

ネットワークの設定

Debian 10 Buster : 初期設定 : ネットワークの設定 : Server Worldに基づいて固定IPアドレスの設定に変える。

% sudo cp -p /etc/network/interfaces /etc/network/interfaces.org
% sudo vi /etc/network/interfaces

以前のサーバからのユーザ情報の移行

以前のサーバの以下のファイルからユーザアカウント(一般的に1000番以降)をコピーする。

  • /etc/passwd
  • /etc/shadow
  • /etc/group
  • /etc/gshadow

以前のサーバのファイルを〜.oldとしてサーバ上にコピーしておく。

% sudo vipw (/etc/passwdを編集するためのviコマンド呼び出し)
% sudo vipw -s (/etc/shadowを編集するためのviコマンド呼び出し)
%  sudo vigr (/etc/groupを編集するためのviコマンド呼び出し)
%  sudo vigr -s (/etc/gshadowを編集するためのviコマンド呼び出し)

vi(vim)で他のファイルを挿入する場合は「: r ファイル名」とする。(参考:vi で編集中に別のファイルの内容を読み込む – DACELO SPACE
ユーザ上のの以降に関する参考サイト

セキュリティ関係の設定

そこそこセキュアなlinuxサーバーを作る - Qiitaを参考に以下を実行する。

  • sshでrootにlogin出来なくする
  • sshdのプロトコルを2に限定する
  • sshguardかfail2banを導入する
  • 使わないポートを閉じる
  • passpromptを変える
  • logwatchを入れる

passpromptを変える

sudoを実行した際のパスプロンプトをそこそこセキュアなlinuxサーバーを作る - Qiitaの設定を参考に変更する。

% su
# visudo

以下を加える。

Defaults passprompt = "%u@%h -> Password!!! -> "

sshdの設定の変更

/etc/ssh/sshd_configの設定をそこそこセキュアなlinuxサーバーを作る - Qiitaの設定を参考に変更する。

sshguardかfail2banを導入する

% sudo aptitude sshguard

logwatchを入れる

% sudo apt install logwatch

Debian 8 (Jessie) - ログ解析ツール logwatch インストール! - mk-mode BLOGに従い、設定ファイルを設置する。

% cp /usr/share/logwatch/default.conf/logwatch.conf /etc/logwatch/conf/

logwatch.conf の「MailTo =」でログを送信したい宛先メールアドレスを設定する。

自動時刻合わせ

ntpdateをインストールする。

% sudo apt install ntpdate

crontabで時間合わせする。/etc/cron.weekly にスクリプトを置く。

% sudo touch /etc/cron.weekly/ntpdate.sh
% sudo chmod 755 /etc/cron.weekly/ntpdate.sh

組織内のNTPサーバがhogehoge.jpとしたとき、ntpdate.shの内容は以下の通り。

#!/bin/sh
/usr/sbin/ntpdate hogehoge.jp > /dev/null 2>&1

GCC関連のインストール

% sudo aptitude install gcc g++ make autoconf m4 bison flex

その他インストール

% sudo apt install -y zsh

リンク:2014年の人工知能学会誌表紙問題の振り返り

以下の話題でちょくちょく2014年の人工知能学会誌表紙問への言及をみる。
www.asahi.com

その後に振り返りの試みも行われていたのでそれらへのリンクをメモ。振り返ってみると主たる論点違うのね。人工知能学会誌表紙の方は、「女性は家事をする性である」という考えを無性別である人型ロボットに組み込んでいること、そして、それを学会が無自覚に行っていたことが問題点だったと認識している。

当時の反応と表紙の画像
togetter.com
togetter.com

人工知能学会の表明
www.ai-gakkai.or.jp

翌号にて検証の小特集が実施された。翌号の見出し。
www.ai-gakkai.or.jp

以下、小特集の論文。PDFはダウンロード可能。

表象文化論学会においてワークショップも行われ議論されている。以下はそのワークショップの報告。

2014年7月におこなわれた「パネル6:知/性、そこは最新のフロンティア──人工知能とジェンダーの表象」の報告
repre.org

2014年11月に行われた「ワークショップ:人工知能とジェンダー」の報告。
repre.org

追記(2022年1月28日)

初めから女性研究者のストーリーを考えており、その導入が切り取られて批判が集まったというわけではなく、批判が集まったものをどうやってポジティブなものにするのか必死に考えた結果が女性研究者のストーリーとのことです。

多くの議論を巻き起こした直後に発行される 3 月号の表紙デザインをどうするのか,我々はもめにもめた.2014 年初頭の編集委員会は「学会として表紙問題にどう向き合うべきか」の議論にほとんどの時間が費やされた.編集委員会のみならず理事会でも同じ様子であったと聞く.結果として,2014 年 3 月号の表紙は私のアイディアが採用された.3 月号の表紙は「女性アンドロイドの視野」となった.「3 月号に男性アンドロイドを掲載しても,問題は解決されない.むしろ状況は悪化する可能性がある.1 月号の表紙は世に出てしまった事実は変えられない.「うつろな目」と指摘されるこの女性アンドロイドが何を見ていたのか,その先を描こう」と私は主張した.これは考えや含みがある主張でもなんでもなく,後先考えない単なる思いつきだった.

3 月号は何とか世に出た.次に問題となるのは当然,5 月号の表紙デザインである.全くのノープランであった.私はそこで表紙をストーリー仕立てにするアイディアを出した.しかも,まだ表紙に登場していない「女性研究者」が主役のストーリーだ.3 月号の男の子はこの女性研究者の息子,1 月号のリビングは女性研究者の自宅,女性アンドロイドはこの女性研究者が開発したもの......というようにどんどん後付けのストーリーが出来上がり,11 月号までの掲載内容が決まった.我々はストーリーのプロではない.研究者である.だからこそ,研究者がどのように「ニーズ」を知り,どのように「研究の方向性」定めていくのか,研究活動の先,さらには研究人生を支えるものは何かを描きたいと思った.2014 年に発行した計 6 冊の学会誌表紙に展開したストーリーは,編集委員会という全くの素人集団が思い描いたものである.この一年間は,編集委員全員がストーリーを創り出すという未知の体験に知恵を絞り,それと同時に1 月号に無自覚に掲載してしまった表紙デザインの問題について深く反省するものとなった.