アプリケーションが特定のファイルにアクセスする必要がある場合の正しいアプローチは何ですか?

アプリケーションが特定のファイルにアクセスする必要がある場合の正しいアプローチは何ですか?

今日、私は興味深いシナリオに直面しました(少なくともLinux初心者の私にとって)。ドローンをLinux PCに接続しました。ドローン構成ソフトウェア(Betaflight)をドローンに接続できません。クイックGoogle検索で問題を解決しました。デフォルトでは、ドローンをUSBケーブルで接続すると、ファイルが作成され、権限が付与され/dev/ttyUSB0ます660。ファイルの所有者はroot、ファイルのグループはですuucp。したがって、簡単な解決策は、このファイルを666

rこのファイルの権限を追加しました。wみんな、これはとてもそうだと思います。あるいは、uucpそれは重要なグループなので、愚かなように見えるBetaflightをグループに追加したり、悪いように見えるsudoで実行したりすることができると思いました。

この問題を処理する正しい方法は何ですか?論理的には、rwBetaflightがこの特定のファイルにアクセスできるように特別にルールを追加するのが妥当です。 「Linux方式」とは何か疑問に思います。私はランダムなアプリケーションが私のOSに過度にアクセスしたくないし、どんなアプリケーション/ユーザーも特定のファイルにアクセスしたくありません。

答え1

Unix&Linux へ Andrzej を歓迎します。

付与する権限を最小限に抑えるには、以下をお勧めします。

  1. 専用グループを作成します(名前を指定しますdrone)。addgroup drone
  2. /dev/ttyUSB0グループに変更drone:chgrp drone /dev/ttyUSB0
  3. ドローン設定ソフトウェア(と呼ばれる/usr/bin/foo)をこのグループに変更し、droneこのsetgidビットを有効にします。chgrp drone /usr/bin/foo; chmod g+s /usr/bin/foo
  4. other構成ソフトウェアの実行を無効にし、user1ファイルACLを使用してそれを実行するための専用ユーザー(私たちが呼び出す)権限を付与するオプションがあります。chmod o-x /usr/bin/foo; setfacl -m u:user1:r-x /usr/bin/foo

sudo3と4は、専用ユーザーがグループとして構成ソフトウェアを実行できるようにする使用に置き換えることができますdrone。以下を追加できます/etc/sudoers

user1 ALL=(:drone) /usr/bin/foo

次に、次のように使用しますuser1sudo -g drone foo

答え2

答えはLinuxディストリビューションによって異なります。

Unix当初、シリアル回線とモデムがコンピュータ間の最も一般的なネットワーキングモードであったとき、Eメールとファイル転送はuucpUnix-to-Unix-Copy(またはEメール転送、アクセスなど)のようにシステム間で予約されました。発信接続に使用されるシリアルポートは通常、uucpuucpファミリと呼ばれる特別なグループに割り当てられ、プログラムsetgid uucpにはそのプログラムを許可する権限が割り当てられます。ただこれらのプログラムは、発信シリアルポートにアクセスするためにroot権限を必要としません。

通常のユーザーはuucpファミリのいくつかのツールを実行できますが、ツール自体にはいたずらを避けるために必要なチェックが含まれています。

明らかに、Linuxディストリビューションはまだこの古い命名規則に従います。最新のシステムでは、実際のuucpソフトウェアスイートを使用する可能性が低いため、このuucpグループを使用して、システム所有者が合理的であると判断するようにシリアルポートへのアクセスを制御できます。一部のディストリビューションでは、管理シリアルポートなどの異なる名前のグループを使用します。その理由は、dialout名前がUnixの歴史を知らない人にとって不透明で直感的ではないからです。uucp

uucp私の考えでは、一部のUnix仕様では、このグループが互換性のあるUnixファミリーシステムで常に事前定義されたシステムグループとして存在する必要がある(または少なくとも推奨)していたようです。

一部のディストリビューションには、Debian および関連ディストリビューションで特定のユーザーが特定の種類のデバイス (たとえば、、、、などcdrom) にアクセスできるようにするために使用できる事前定義されたグループが多数あります。audiovideoplugdevscanner

/dev/ttyUSB0単純なファイルではありません。デバイスノード。最新のLinuxディストリビューションでは、デバイスノードはudevRAMベースのファイルシステムによって管理および保存されます。したがって、所有権または権限を使用または変更した場合、そのchmod変更chownchgrp再起動後も維持されません。

したがって、いくつかのオプションがあります。

  • 欲しいならすべてのユーザーシリアルポート使用機能特定のプログラムでのみ利用可能setuid uucp次のプログラムに権限を追加できます。
sudo chgrp uucp /some/where/Betaflight
sudo chmod g+s /some/where/Betaflight
  • 欲しいなら一部のユーザーのみシリアルポートを使用するには、次のユーザーをuucpグループに追加できます。
sudo usermod -a -G uucp username

注:グループメンバーシップはログイン時にユーザーセッションに割り当てられるため、この変更が行われたときにユーザーがすでにログインしている場合は、変更を有効にするためにユーザーがログアウトしてから再度ログインする必要があります。

  • 欲しいなら実際には、ユーザーだけがコンピュータにいます。(ユーザーがSSHを介してリモートでログインするのではなく)シリアルポート(使用されているsystemd-logind場合)またはPAMモジュールへのアクセスを使用して、実際にコンソールにログインしているユーザーにデバイスノードへの追加アクセスを提供できます。

以前のディストリビューションでは、セッション中に指定されたデバイスの所有権をユーザーに譲渡し、セッション終了後に再びルートに戻るか、ローカルにログインしたときにログインしたユーザーに追加のグループメンバーシップを付与することでこれを実行できました。最新の実装では、devtmpfsACLのファイルシステムサポートが成熟し一般化されるにつれて、この目的のためにデバイスでアクセス制御リスト(ACL)を使用する傾向があります。

systemd-logindを使用すると、制御権限を持つデバイスのudevルールを追加して、ローカルにログインしたユーザーにデバイスを割り当てることができます。TAG+="seat"

関連情報