web-dev-qa-db-ja.com

FreeBSDでSquidサービスUIDを変更する方法は?

不思議なことに、squidユーザーがUID 100の影響を受けていない場合、Squidを開始できないようです。別のPIDを使用しようとすると、サービスは体系的に次のエラーで開始できません。

2016/03/10 10:53:13| storeDirWriteCleanLogs: Starting...
2016/03/10 10:53:13|   Finished.  Wrote 0 entries.
2016/03/10 10:53:13|   Took 0.00 seconds (  0.00 entries/sec).
FATAL: Ipc::Mem::Segment::create failed to shm_open(/squid-cf__metadata.shm): (17) File exists

Squid Cache (Version 3.5.15): Terminated abnormally.
CPU Usage: 0.026 seconds = 0.026 user + 0.000 sys
Maximum Resident Size: 48640 KB
Page faults with physical i/o: 0

通常、サービスPIDの変更に進む方法は次のとおりです。

  1. vi /etc/groupサービスのGIDを変更するには:

    前:

    squid:*:100:
    

    後:

    squid:*:1234:
    
  2. vipwサービスUIDを変更するには:

    前:

    squid:*:100:100::0:0:squid caching-proxy pseudo user:/var/squid:/usr/sbin/nologin
    

    後:

    squid:*:1234:1234::0:0:squid caching-proxy pseudo user:/var/squid:/usr/sbin/nologin
    
  3. 次の2つのコマンドを使用して、ファイルの所有権を復元します。

    find / -uid 100 -exec chown -v squid {} +
    find / -gid 100 -exec chgrp -v squid {} +
    

Ezjailで管理されているFreeBSDjailにSquidをインストールしています。

IPCについて考えましたが、Squidが正常に実行されているときにipcs -aを使用してIPC)が見つかりませんでした。

また、新しいクリーンジェイルで、最初にカスタムUIDを使用してsquidユーザーを作成し、次にsquidパッケージをインストールして、正しいUIDが最初から使用されていることを確認しました。 squid PID 100のユーザーはいつでも存在していましたが、同じ問題がありました(この問題は、所有権の問題からは発生しないと結論付けています)。 UIDを100に設定すると、Squidが起動できるようになります。

いくつかのPID(101のような低いものを含む)を試しましたが、すべて同じ動作を示しています。

また、squid_userrc.confパラメータを試してみましたが、うまくいきませんでした。squidまたはrootのいずれかに設定すると、表示されません。何かを変えるために。

同じシステム上にPID100で実行されているSquidを備えた別の刑務所がありますが、それをシャットダウンしても問題はまったく変わりませんでした(すべての場合において、2つの刑務所間の干渉に非常に驚かされます)。

4
WhiteWinterWolf

はい、わかりました。いくつかのチェックの後 FreeBSDフォーラムで 、SHMオブジェクトに関する限り、FreeBSDjailがスイスチーズのように機能することを確認できます。実際、FreeBSDはSHMオブジェクトの分離をまったく提供していません。すべてのjailは、システム全体ですべてのSHMオブジェクトにアクセスでき、それを防ぐ方法はありません。

したがって、この質問で言及されているエラーは非常に論理的です。

  • 別のUIDが使用された場合、別のユーザーが所有するSHMオブジェクトにアクセスしようとしたため、Squidを起動できませんでした。そのため、エラーメッセージ "create failed to shm_open(/squid-cf__metadata.shm): (17)ファイルが存在します "
  • 両方のインストールで同じUIDが使用された場合、Squidは正常に起動しましたが、両方のインスタンスが同じメモリオブジェクトと戦い、相互にデータを書き換え、シャットダウン時にオブジェクトを削除するため、状況はさらに悪化しました...

このため、各Squidインスタンスが異なるSHMオブジェクト名を使用するように特定の対策を講じる必要があります。

デフォルトでは、SquidはFreeBSDシステム上に次のSHMオブジェクトを作成します(正確な動作はOSに依存します)。

/squid-cf__metadata.shm
/squid-cf__queues.shm
/squid-cf__readers.shm

squid-nパラメータを提供して、インスタンスに特定の名前を付けることができます。具体的には、この名前は(とりわけ)上記のSHMオブジェクト名の「squid」に置き換わるため、SHMオブジェクト名はシステム全体で一意になります。

したがって、新しい刑務所に新しいSquidインスタンスを設定するときは、/etc/rc.confを編集して、次のようなエントリを追加する必要があります(「something_unique」をホストで一意のインスタンス名に置き換えます)。

squid_flags="-n something_unique"

これにより、それぞれが異なるUIDを持つ両方のSquidサーバーを適切に起動できます。

明らかに、ここでは少し範囲外ですが、SquidのSHMオブジェクトに任意の刑務所から自由にアクセスできるという事実は、それ自体でセキュリティの問題を構成する可能性があり、無視してはなりません...

3
WhiteWinterWolf