今日、私は興味深いシナリオに直面しました(少なくともLinux初心者の私にとって)。ドローンをLinux PCに接続しました。ドローン構成ソフトウェア(Betaflight)をドローンに接続できません。クイックGoogle検索で問題を解決しました。デフォルトでは、ドローンをUSBケーブルで接続すると、ファイルが作成され、権限が付与され/dev/ttyUSB0
ます660
。ファイルの所有者はroot
、ファイルのグループはですuucp
。したがって、簡単な解決策は、このファイルを666
。
r
このファイルの権限を追加しました。w
みんな、これはとてもそうだと思います。あるいは、uucp
それは重要なグループなので、愚かなように見えるBetaflightをグループに追加したり、悪いように見えるsudoで実行したりすることができると思いました。
この問題を処理する正しい方法は何ですか?論理的には、rw
Betaflightがこの特定のファイルにアクセスできるように特別にルールを追加するのが妥当です。 「Linux方式」とは何か疑問に思います。私はランダムなアプリケーションが私のOSに過度にアクセスしたくないし、どんなアプリケーション/ユーザーも特定のファイルにアクセスしたくありません。
答え1
Unix&Linux へ Andrzej を歓迎します。
付与する権限を最小限に抑えるには、以下をお勧めします。
- 専用グループを作成します(名前を指定します
drone
)。addgroup drone
/dev/ttyUSB0
グループに変更drone
:chgrp drone /dev/ttyUSB0
- ドローン設定ソフトウェア(と呼ばれる
/usr/bin/foo
)をこのグループに変更し、drone
このsetgid
ビットを有効にします。chgrp drone /usr/bin/foo; chmod g+s /usr/bin/foo
other
構成ソフトウェアの実行を無効にし、user1
ファイルACLを使用してそれを実行するための専用ユーザー(私たちが呼び出す)権限を付与するオプションがあります。chmod o-x /usr/bin/foo; setfacl -m u:user1:r-x /usr/bin/foo
sudo
3と4は、専用ユーザーがグループとして構成ソフトウェアを実行できるようにする使用に置き換えることができますdrone
。以下を追加できます/etc/sudoers
。
user1 ALL=(:drone) /usr/bin/foo
次に、次のように使用しますuser1
。sudo -g drone foo
答え2
答えはLinuxディストリビューションによって異なります。
Unix当初、シリアル回線とモデムがコンピュータ間の最も一般的なネットワーキングモードであったとき、Eメールとファイル転送はuucp
Unix-to-Unix-Copy(またはEメール転送、アクセスなど)のようにシステム間で予約されました。発信接続に使用されるシリアルポートは通常、uucp
uucpファミリと呼ばれる特別なグループに割り当てられ、プログラムsetgid uucp
にはそのプログラムを許可する権限が割り当てられます。ただこれらのプログラムは、発信シリアルポートにアクセスするためにroot権限を必要としません。
通常のユーザーはuucpファミリのいくつかのツールを実行できますが、ツール自体にはいたずらを避けるために必要なチェックが含まれています。
明らかに、Linuxディストリビューションはまだこの古い命名規則に従います。最新のシステムでは、実際のuucp
ソフトウェアスイートを使用する可能性が低いため、このuucp
グループを使用して、システム所有者が合理的であると判断するようにシリアルポートへのアクセスを制御できます。一部のディストリビューションでは、管理シリアルポートなどの異なる名前のグループを使用します。その理由は、dialout
名前がUnixの歴史を知らない人にとって不透明で直感的ではないからです。uucp
uucp
私の考えでは、一部のUnix仕様では、このグループが互換性のあるUnixファミリーシステムで常に事前定義されたシステムグループとして存在する必要がある(または少なくとも推奨)していたようです。
一部のディストリビューションには、Debian および関連ディストリビューションで特定のユーザーが特定の種類のデバイス (たとえば、、、、などcdrom
) にアクセスできるようにするために使用できる事前定義されたグループが多数あります。audio
video
plugdev
scanner
/dev/ttyUSB0
単純なファイルではありません。デバイスノード。最新のLinuxディストリビューションでは、デバイスノードはudev
RAMベースのファイルシステムによって管理および保存されます。したがって、所有権または権限を使用または変更した場合、そのchmod
変更chown
はchgrp
再起動後も維持されません。
したがって、いくつかのオプションがあります。
- 欲しいならすべてのユーザーシリアルポート使用機能特定のプログラムでのみ利用可能、
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モジュールへのアクセスを使用して、実際にコンソールにログインしているユーザーにデバイスノードへの追加アクセスを提供できます。
以前のディストリビューションでは、セッション中に指定されたデバイスの所有権をユーザーに譲渡し、セッション終了後に再びルートに戻るか、ローカルにログインしたときにログインしたユーザーに追加のグループメンバーシップを付与することでこれを実行できました。最新の実装では、devtmpfs
ACLのファイルシステムサポートが成熟し一般化されるにつれて、この目的のためにデバイスでアクセス制御リスト(ACL)を使用する傾向があります。
systemd-logind
を使用すると、制御権限を持つデバイスのudevルールを追加して、ローカルにログインしたユーザーにデバイスを割り当てることができます。TAG+="seat"