PostgreSQLのRow Level Securityが有効でポリシーが付いているのかを調べるリンター postgrls を作った

3行まとめ

  • PostgreSQLのRLSはテーブル定義と共にポリシー定義をする必要があるが、別に定義する必要があるので忘れがち
  • 人間が気をつけるのは不可能なので仕組みで解決するべくリンターを作った
  • Cline + Claude 3.7 sonnetですぐ作れたけど楽しくなかった

GitHub - Azuki-bar/postgrls: PostgreSQL RLS linter

背景

PostgreSQLのRow Level Security(以下RLS)を使ったことがありますか。

PostgreSQLではテーブル定義と共にAlter TableをしてRLSを有効にする必要があります。しかもこれだけではまだ不十分でそこからポリシーを有効にする必要があります。

-- https://www.postgresql.jp/document/16/html/ddl-rowsecurity.html より引用

CREATE TABLE accounts (manager text, company text, contact_email text);

ALTER TABLE accounts ENABLE ROW LEVEL SECURITY;

CREATE POLICY account_managers ON accounts TO managers
    USING (manager = current_user);

www.postgresql.jp

このようにテーブル定義だけではなく、最低でも2文を追加で書く必要があります。

セキュリティに関する制約であるにも関わらず強制する仕組みがなく困っていました。

リンター作った

という問題があったのでリンターを作りました。

名前はpostgrlsです。PostgreSQLのRLSを検査するからその要素から文字を取りました。ポストガールズって読ませることを意図しています。 この名前はClaude 3.7 sonnetが考えてくれました。

GitHub - Azuki-bar/postgrls: PostgreSQL RLS linter

テーブル定義に対して、1つのRLSを有効にする設定と1つ以上のポリシーの設定がないときは終了コード1を吐くリンターです。

仕組みとしてはpg-queryを用いてASTを取得し、集めているだけです。

さまざまな環境でシングルバイナリで動いて欲しかったのでgoを使いました。pg-queryは大抵の言語で動くけどpg-queryが呼んでいるライブラリの組み込みとかが面倒そうだった。

github.com

使いかた

$ cat testdata/fixtures/test.sql
CREATE TABLE accounts (id int, manager text);
CREATE TABLE users (id int, name text);
ALTER TABLE accounts ENABLE ROW LEVEL SECURITY;
CREATE POLICY account_managers ON accounts USING (manager = current_user);

$ postgrls testdata/fixtures/test.sql
[
  {
    "message": "Table 'users' does not have RLS enabled",
    "location": {
      "file": "testdata/fixtures/test.sql",
      "line": 45,
      "column": 1
    },
    "table_name": "users",
    "rule_id": "rls-not-enabled"
  }
]
missing RLS configuration

$ echo $?
1

こんな感じ。標準入力からSQLを読んだり判定の除外をする設定は書いた。将来的にreviewdogで指摘させたいのでerrorformatやrdjsonlなどの形式で出力するようにしたい。

一方でまだリリースフローを組んだりREADMEを書いたりしていないので順を追ってやりたい。

AI Coding Agents

CilneやCursorなどのAIコードエージェントが流行っているので、Cline+Claude 3.7 sonnetを使ってコードを書いてみました。

要件を定義しPlanモードで指摘しまくって、Actモードにすればそれなりの動作をするコードはできました。 大体700行くらいのコードですが、完成までに2ドルくらいでできました。

AI Coding Agents楽しくない

一方でAI Coding Agentsを使った開発は楽しくないなと感じました。コードレビューのときに使う頭だけをずっと使わされている感覚になった。しかもそれでいて責任だけ取らされている感覚になる。

結局コードを書く過程が好きだったんだなと。そしてこれはオートマチック車を運転するのが主流になった今もクラッチとミッションを触って運転する人と一緒だなと気がつきました。これからはコードを書く過程も大切にしたい。

まとめ

ぜひお使いください。

こういうことを叶えるリンターを見つけられなかったので自作したのですがこういう奴ってすでにあったりしますかね?