MagicStack / MagicStack/asyncpg

Exception when attempting to fetch SSL info

オープン
#884 コメント 1 件 リアクション 3 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

主要言語
Python
スター
8.1k
フォーク
468
PR マージ指標
30日以内にマージされた PR はありません

説明

Thanks for creating asyncpg! It's dramatically improved the performance of my [open-source web application](https://github.com/RunestoneInteractive) ([Runestone Academy](https://runestone.academy/), a free interactive e-book).

To reproduce this bug, simply start asyncpg as a non-root user (one without permission to access `/root`).

* **asyncpg version**: 0.25
* **PostgreSQL version**: 12.7
* **Do you use a PostgreSQL SaaS? If so, which? Can you reproduce
the issue with a local PostgreSQL install?**: I use AWS RDS; haven't tested locally
* **Python version**: 3.9.1
* **Platform**: Debian GNU/Linux 11 (bullseye)
* **Do you use pgbouncer?**: No
* **Did you install asyncpg with pip?**: Yes
* **If you built asyncpg locally, which version of Cython did you use?**: N/A
* **Can the issue be reproduced under both asyncio and
[uvloop](https://github.com/magicstack/uvloop)?**: I only use asyncio

I run asyncpg as a non-root user for improved security; this user lacks root access. During startup in asyncpg v. 0.25, I see the error like this:

```
File "/srv/web2py/applications/runestone/.venv/lib/python3.9/site-packages/asyncpg/connection.py", line 2085, in connect
return await connect_utils._connect(
File "/srv/web2py/applications/runestone/.venv/lib/python3.9/site-packages/asyncpg/connect_utils.py", line 874, in _connect
addrs, params, config = _parse_connect_arguments(timeout=timeout, **kwargs)
File "/srv/web2py/applications/runestone/.venv/lib/python3.9/site-packages/asyncpg/connect_utils.py", line 640, in _parse_connect_arguments
addrs, params = _parse_connect_dsn_and_args(
File "/srv/web2py/applications/runestone/.venv/lib/python3.9/site-packages/asyncpg/connect_utils.py", line 543, in _parse_connect_dsn_and_args
if not sslkey.exists():
File "/usr/local/lib/python3.9/pathlib.py", line 1424, in exists
self.stat()
File "/usr/local/lib/python3.9/pathlib.py", line 1232, in stat
return self._accessor.stat(self)
PermissionError: [Errno 13] Permission denied
```

In [connect_utils.py line 543](https://github.com/MagicStack/asyncpg/commit/383c711eb68bc6a042c121e1fddfde0cdefb8068#diff-fe0ec192392fe4131382e009b40723ba9469e62ab4760fed681a438d1d352bc3R529), asyncpg checks if a root-owned file exists. Unfortunately, a non-root user gets a permission denied exception instead of a False return value from `exists()`. It looks like wrapping this in a try/except would fix this bug. (It looks like [a later exception](https://github.com/MagicStack/asyncpg/commit/383c711eb68bc6a042c121e1fddfde0cdefb8068#diff-fe0ec192392fe4131382e009b40723ba9469e62ab4760fed681a438d1d352bc3R529) needs PermissionError added to it.)

For me, reverting to asyncpg v. 0.24 causes my code to run without problems.

コントリビューションガイド

このリポジトリのコントリビューションガイドは索引されていません

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

調査の方向性

connect_utils.py の 543 行目付近から始めます。ここでは、接続引数の解析中に SSL キーの存在が確認されます。/root へのアクセス権がない非 root ユーザーとして接続を再現し、SSL の検索で PermissionError が発生しなくなり、asyncpg 0.24 の場合と同様に接続が続行されることを確認します。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
postgresql, python
領域
database
issue の種類
バグ
難易度
2/5
見積もり時間
1〜3時間
活発さ
停滞
明瞭さ
明確に書かれている
初心者へのやさしさ
45/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。