pfaffman
(Jay Pfaffman)
2019 年 11 月 8 日午後 5:37
1
さて、インストールが失敗しました(インストールスクリプトは mailgun_api_key を設定するために API キーを取得します)。ローカル開発インスタンスでも確認しました。
$ rake api_key:get
rake aborted!
NoMethodError: undefined method `create_master_key' for ApiKey (call 'ApiKey.connection' to establish a connection):Class
Did you mean? create_with
/home/pfaffman/src/discourse/lib/tasks/api.rake:5:in `block in <main>'
Tasks: TOP => api_key:get
(See full trace by running task with --trace)
これは このコミット です。@david
PR はこちらです: FIX: create_master_key got renamed by pfaffman · Pull Request #8325 · discourse/discourse · GitHub
david
(David Taylor)
2019 年 11 月 8 日午後 5:46
2
@pfaffman さん、ありがとうございます。PR にコメントしました。
pfaffman:
私のインストールスクリプト
確認ですが、これは標準のインストールスクリプトではなく、あなた個人のスクリプトでしょうか?
pfaffman
(Jay Pfaffman)
2019 年 11 月 8 日午後 5:49
3
はい!通常のインストールには影響はありませんでした。API キーを必要とする mailgun_api_key の設定を行う、インストール後の処理の一部のみが機能しなくなりました。
この rake タスクを使っている人は少ないと思います。
david
(David Taylor)
2019 年 11 月 8 日午後 5:51
4
興味本位で伺いますが、作業が完了したら API キーを削除していますか?最近、API キーの管理をより確実に行えるよう、多くの変更を加えました。未使用の API キーがセキュリティ上の潜在的な脆弱性として残らないようにすることを目標としています。
もしこれがサーバー上で実行されている場合、API キーを生成して使用する代わりに、Ruby を使ってサイト設定を設定することは可能でしょうか?
pfaffman
(Jay Pfaffman)
2019 年 11 月 8 日午後 5:55
5
おっと!もしキーが既に存在する場合は変更しないか、create_if_not_exists タスクを用意した方がよいと思います。rake タスクで既存のキーを取得し、それを変更せずにキーを使用している他の部分を壊さずに済むのは非常に便利です。
私の Ansible ツールリングでは、API キーを持っていない場合、以下のようにその rake タスクを呼び出して既存のキーを取得しています。
- name: Get api key
block:
- shell: docker exec -w /var/www/discourse -i {{ discourse_yml }} rake api_key:get
register: get_api_key
- set_fact:
discourse_api_key: "{{ get_api_key.stdout }}"
when: discourse_api_key is not defined
本当にこの方法で取得する必要があるのは、クリーンインストールを行っている時だけだと思います。(既存のサイトについては、そのサイトの vars に API キーを保持しています。)
新しいキーの扱い方であれば、使用後にキーを削除するか、あるいはコンテナ内で Rails スクリプトを実行してサイト設定を変更する方法もあるかもしれませんね。
david
(David Taylor)
2019 年 11 月 8 日午後 6:17
6
[quote=“pfaffman, 投稿:5, トピック:132948”]
rake タスクで既存のキーを取得できるようにするのは非常に便利ですね。変更して何かを壊す必要がありません。[/quote] 変更した点の一つとして、ユーザーごとに複数のキー(または複数の「マスターキー」)を持たせられるようにしました。つまり、各統合に独自のキーを割り当てることができ、それらを個別に監査・無効化・削除できるようになりました。したがって、あなたのケースでは、「pfaffman のセットアップツール」という説明付きのキーを作成できます。そうすれば、サイト管理者はその用途を理解でき、不要になった時点で無効化や削除が可能になります。rake タスクへの適用方法については確信が持てません。もしかすると、api:get_or_create "my key description" というタスクを用意できるかもしれませんね @pfaffman さん、これであなたのケースに対応できるでしょうか?
david
(David Taylor)
2019 年 11 月 8 日午後 7:03
8
pfaffman
(Jay Pfaffman)
2019 年 11 月 8 日午後 7:10
10
私には良さそうです!それに、私のプレイブックはエディタで開いたままだったので、もうコミット済みです。
david
(David Taylor)
2019 年 11 月 29 日午後 3:56
16
@pfaffman さん、申し訳ありませんが、今後の PR でこの新しい rake タスクを削除せざるを得なくなります。API キーをデータベースでハッシュ化することになるため、既存のキーを取得することは本質的に不可能になります。
master ← davidtaylorhq:api-key-hash
merged 11:45AM - 12 Dec 19 UTC
> ⚠️This change is completely irreversible. Once the migrations are run, the pla… in text keys will be deleted from the database. Marking as a draft PR for now to avoid accidental merging, but this is ready for review.
API keys are now only visible when first created. After that, only the first four characters are stored in the database for identification, along with an sha256 hash of the full key. This makes key usage easier to audit, and ensures attackers would not have access to the live site in the event of a database leak.
Many of the changes in this diff are to implement the new post-create UI, which looks like:
<img width="1138" alt="Screenshot 2019-11-29 at 15 20 09" src="https://user-images.githubusercontent.com/6270921/69878077-c914f680-12bb-11ea-8645-435d7491f265.png">
From a security perspective, the key files to review are:
- `app/models/api_key.rb`
- `lib/auth/default_current_user_provider.rb`
- `db/migrate/20191128113434_add_hashed_api_key.rb`
- `db/post_migrate/20191128113435_remove_key_from_api_keys.rb`
@danielwaterworth I had some issues with `fab!` in the tests, because it 'refinds' the record from the database after the initial save. The keys are kept temporarily as instance variables, so this refind was causing the key to be lost. I set `refind:false` in these places, but would be interested if you know of a cleaner solution.
get_or_create_master タスクは、単純な create_master タスク に置き換えました。これは無条件に新しいキーを作成します。キーを 1 つだけ保持したい場合は、ご自身のシステムでキーを管理する必要があります。
pfaffman
(Jay Pfaffman)
2019 年 11 月 29 日午後 4:43
17
そうですね。それも予想していました。他のシステムでは API キーは一度しか表示されないため……
お気遣いありがとうございます!
pfaffman
(Jay Pfaffman)
2019 年 11 月 29 日午後 6:01
18
すぐに判断できません。(待って、dbディレクトリにschema.rbがないのはなぜ?)
同じsome nameで複数のrake api_key:create_master['some name']を実行すると失敗しますか?つまり、その名前は一意である必要がありますか?
david
(David Taylor)
2019 年 11 月 29 日午後 6:05
19
説明文は一意である必要はありません。ただし、見た目が似たキーを多数作成すると、かなり混乱する可能性があります。
pfaffman:
schema.rb がないのはなぜですか?
schema.rb ファイルはコミットしていません。確認すべき最良の場所は、/app/models 配下の各ファイルの下部にある注釈です。
pfaffman
(Jay Pfaffman)
2019 年 11 月 29 日午後 6:16
20
えっ、何?いつからですか?私のハードドライブにある現在の Discourse ソースには、まだ schema.rb が含まれています。どのモデルを探しているのかをすぐに把握できるのは、本当に、本当に便利です。単一のファイルを開いて何かを検索する(例えば、どのモデルを探しているのかを特定する)のは、app/models 内の 200 以上のファイルを探すよりもはるかに簡単です。モデルの末尾にあるスキーマだけを grep で検索する良い方法さえありません。
探しているモデルがわからない場合、どうやって見つけるのでしょうか?「auth」に関連するテーブルがいくつかあり、すべてが auth で始まるわけではないので、どこを探せばよいのかどうやって判断できるのでしょうか?
david
(David Taylor)
2019 年 11 月 29 日午後 7:22
21
pfaffman:
待って、どういうこと?いつから?
最初からですよ。.gitignore ファイルに含まれています。ただし、db:migrate を実行すると生成されるため、ローカルには存在します。
テーブル名は常にモデル名と一致するので、ファイル名を使っています
pfaffman
(Jay Pfaffman)
2019 年 11 月 29 日午後 7:37
22
なるほど。私の知識不足でした。:wink 解説ありがとう。
テーブルやモデルの名前がわからないこともあるので、すべてのフィールドを一处にまとめられているのは非常に助かります。