2009-03-10 15 views
1

私は、私がシリアルデバイスにアクセスできるように私がWeb環境で持っている権限を昇格させたいという状況があります。ファイルアクセスのためのWeb環境での特権昇格

特定のケースでは、/dev/ttyUSB[0-9]にあるモデムを設定するためのWebインターフェイスがあります。

ゼロ以上のモデムは、エンドユーザーによって接続されます。私は/sys/devicesを読んで、いくつかのATコマンドを使ってモデムと話すことによって、USBワイヤレスモデムであることを識別できるいくつかのソフトウェアを書いています。

ように私には、デバイスを開いて、何かをできるようにしたいと思います。問題はpyserialこのないことである

ser = serial.Serial(tty, baudrate=115200, timeout=10) 
ser.write('AT+CGSN\r\n') 
imei = ser.readline() 

:portstrが/dev/ttyUSB0あるシリアルポートを開き、self.fd = os.open(self.portstr, os.O_RDWR|os.O_NOCTTY|os.O_NONBLOCK)を、それはそれをしません特権を持たないnobodyユーザーとします。

このシステムのシリアルポートはroot:uucpが所有し、0660(つまりrw-rw----)に設定されています。

nobodyのように、devでファイルを開くためにできるだけ少ない権限を持つべきユーザのための最良の方法は何ですか?私が検討していきます

アイデア:

  • sudoを使用してサブプロセスで物事を行います。
  • ソフトウェアの別のAPIや片を用い/dev/(udevのは高く評価されて使用して適切にこれを行う方法について!)
  • 内のファイルのパーミッションを変更する私は考慮されていません。

答えて

1

は、chgrpコマンドに新しいデバイスをudevのルールを設定します。ここに私が入れたのはeee-bpwファイル/etc/udev/rules.d/99-bpw.rulesのパッケージです。

# Sierra Wireless AirCard 880 U 
BUS=="usb", KERNEL=="ttyUSB2*", ACTION=="add", \ 
    PRODUCT=="1199/6855/0", DEVNAME=="/dev/tts/USB2", \ 
    OWNER="root", GROUP="dialout", \ 
    SYMLINK+="bpw", RUN="/usr/sbin/bpw" 

代替ためダイヤルアウト。この特定のルールでは、デバイス名が/dev/ttyUSB2と仮定していますが、ルールをかなり拡張することができます。udevのドキュメントを参照してください。

-1

sudoのアイデアが可能でした。 IIRCでは、特定のコマンドをsudo可能にすることができますが、パスワードは必要ありません。

もう1つの方法は、希望のデバイスにアクセスできるグループにnobodyを入れるか、またはApacheがアクセス権を持つグループとして起動することです。

fastcgi(またはequiv)を使用している場合、所有しているユーザーとしてスクリプトを実行することができます(一部の共有ホストはこれを行います)。

ファイルのアクセス許可を/devに変更するには、chmodを使用します。

2

この場合、ソケット接続を受け入れて適切なデバイスに中継したシステムユーザーがデーモンを書き、Webアプリケーション内のソケットを使用してデーモンと通信します。これはまた、ユーザーに対処するための準備が整っていないデバイスを開いたり、CGIなどを使ってできるよりもはるかに安全な方法でロックを解決したりするときに、Webアプリのブロッキングを防ぐのに役立ちます。

ただし、アプリケーションはデバイスに直接話す能力を持ち、ヌルと同じアクセス権を与えます。

+0

これはおそらくこれまでに提案された最も実行可能なアイデアです。 – Jerub

1

「devでファイルを開くためにできるだけ少ない権限を持つ人がいないなど、ユーザーにとって最良の方法は何ですか?」

実際には、Webアプリケーションのデーモンモードでmod_wsgiを使用する方がよいでしょう。mod_wsgiユーザーは、指定したユーザー名(およびグループ)を使用できます。

適切に定義された権限を持つユーザーとして実行できます。 UNIX/LinuxはUnixソケット経由でファイルディスクリプタを送信することができます:

は、これを行う別の方法がありますhttp://code.google.com/p/modwsgi/wiki/ConfigurationDirectives#WSGIDaemonProcess

+0

ヤック、アイデアは、ユーザーが特権を持たないということです。もし私が別のユーザーとしてWebスクリプトを実行したいと思ったら私はそうします。この考えは、ユーザーに可能な限り少ない能力を与えることです。 – Jerub

+0

正しい。 mod_wsgiのユーザー名とグループでは、可能な限り最小の特権を与えます。 –

+0

私は既にいくつかの権限を持つユーザーを持っています。私は単一のコンテキストで少しずつより多くのパーミッションを与えたいと思っています。私はなぜこれが私の問題の解決策だと思うのか分かりません。 – Jerub

2

を参照してください。そのためのPerlモジュールもあります:PassAccessRights.pm。 Python用の同様のモジュールが見つかりませんでしたが、簡単に実装できました。ウェブインタフェースを介して、すべてのアクセスは、デバイスへの同じアクセスを許可することを許容できるかどう

+0

興味深い考え。 UNIXのソケット上にファイル記述子を渡すコードが必要ですが、これまでのところはデーモンで作業を行い、RPCメカニズムを介して通信することになります。 – Jerub

関連する問題