ハイパーマッスルエンジニア

Vim、ShellScriptについてよく書く

/etc/aliasesを共有化しようとしてハマったこと

f:id:rasukarusan:20190318210503p:plain:w400

今だったらAWSとかにまかせてしまって/etc/aliasesを触る機会なんてないかもしれんが、最近あったので書いておく。

課題

  • WEBサーバーが複数ある状態
  • 全てのサーバーで/etc/aliasesが同じ状態であること
  • /etc/aliasesを書き換えることがある

上記を踏まえた結果、/etc/aliases共有化してしまおうとして奮闘した話。

/etc/aliasesを共有化する方法

サーバーには既に共有化ディレクトリ(マウントしてあるディレクトリ)がある状態。

  • 案1:/etc/aliasesをシンボリックリンクにして、実体ファイルを共有ディレクトリに置く
  • 案2:/etc/aliasesをハードリンクにして、リンク先を共有ディレクトリに置く
  • 案3:/etc/sendmail.cf内のaliasesのPATHを変更し、共有ディレクトリに向ける。

それぞれ試してどんなエラーが出るのか検証してみた。

案1:/etc/aliasesをシンボリックリンクにして、実体ファイルを共有ディレクトリに置く

以下のように/etc/aliasesを共有ディレクトリに移し、/etc/aliasesはシンボリックリンクにする。

[root@vagrant etc]# ll | grep aliase
lrwxrwxrwx  1 root     root           36  31 11:23 aliases -> /home/shared/aliases

newaliasesを実行するとエラーがでる

[root@vagrant etc]# newaliases
hash map "Alias0": unsafe map file /etc/aliases.db: Symbolic links not allowed
WARNING: cannot open alias database /etc/aliases
Cannot create database for alias file /etc/aliases

結論:ダメ。/etc/aliasesをシンボリックリンクにするとnewaliasesできない。

ただ実はこれ、無理やり解除する方法がある

/etc/sendmail.cfに下記を記載

O DontBlameSendmail=mapinunsafedirpath

これはインフラの鬼と勝手に呼ばさせて頂いている人から聞いた。ソースを直接見て発見したらしい。すげえ。
その人が送ってくれた参考リンクも載せておく。

https://docstore.mik.ua/orelly/other/Sendmail_3rd/1565928393_ch24-65639.html

osr507doc.xinuos.com

ただ、その人も言っていたがセキュリティ的にどうなの?的な話もあるので判断する時は注意しておいたほうが良いだろう。

案2:/etc/aliasesをハードリンクにして、リンク先を共有ディレクトリに置く

案1と同じくsharedに実体ファイルを置いた状態でハードリンクを貼る

[root@vagrant etc]# ln /home/shared/aliases
ln: `/home/shared/aliases' へのハードリンク `./aliases' を作成します: 無効なクロスデバイスリンクです

結論:ダメ。マウントしているディレクトリorパーティションが異なるものへのハードリンクは貼れない。

案3:/etc/sendmail.cf内のaliasesのPATHを変更し、共有ディレクトリに向ける。

/etc/sendmail.cfを編集

# location of alias file
# O AliasFile=/etc/aliases # コメントアウト
O AliasFile=/home/shared/aliases # aliasesのPATHを変更

newaliaseを実行するとエラーがでる。

[root@vagrant etc]# newaliases
WARNING: World writable directory /home/shared
hash map "Alias0": unsafe map file /home/shared/aliases.db: World writable directory
WARNING: cannot open alias database /home/shared/aliases
Cannot create database for alias file /home/shared/aliases

結論:ダメ。aliasesを置いているディレクトリ権限が777だとセキュリティの観点から弾いてしまう。

案3-2:sharedの中に権限755ディレクトリを作成し、その中にaliasesを置く

下記のような構造

/home/shared # 権限777
  |_sendmail # 権限755のディレクトリ
    |_aliases

newaliases を実行

[root@vagrant etc]# newaliases
WARNING: World writable directory /home/shared
hash map "Alias0": unsafe map file /home/shared/sendmail/aliases.db: World writable directory
WARNING: cannot open alias database /home/shared/sendmail/aliases
Cannot create database for alias file /home/shared/sendmail/aliases

が、、、ダメ、、、。 どうやらnewaliasesは道中に権限777のディレクトリがあると弾かれてしまうよう。

/755_dir # 権限755
  |_777_dir # 権限777のディレクトリ
    |_sendmail # 権限755
      |_aliases

sendmail.cf
# location of alias file
O AliasFile=/755_dir/777_dir/sendmail/aliases

[root@vagrant etc]# newaliases
WARNING: World writable directory /755_dir/777_dir
hash map "Alias0": unsafe map file /755_dir/777_dir/sendmail/aliases.db: World writable directory
WARNING: cannot open alias database /755_dir/777_dir/sendmail/aliases
Cannot create database for alias file /755_dir/777_dir/sendmail/aliases

失敗。 下記のように道中に権限777のディレクトリがなければnewaliases成功する。

/755_dir # 権限755
  |_sendmail # 権限755
    |_aliases

sendmail.cf
# location of alias file
O AliasFile=/755_dir/sendmail/aliases

結論

newaliasesの注意点

  • aliasesをシンボリックリンクにすることはできない
  • 権限777のディレクトリにaliasesを配置することはできない

なので権限755で新たに共有ディレクトリを作成し、aliasesを設置。sendmail.cfを編集し、作成したディレクトリ内のaliasesを参照するようにする。ならばイケる。別に755じゃなくても構わない。777以外であればOK。

まあそもそもこんなことをしないよう他で解決できないかを考えたほうが良いと思う。