perf(federation): (re) Ed25519署名に対応する
Fix #14273 Fix of https://github.com/misskey-dev/misskey/pull/13464
What
beta.1での課題をもとに挙動を改善しました
p1.a9z.devなどで運用中
- 署名検証で同一名キーが見つからない場合のupdatePersonなどの最短間隔を12分から5分に短縮
- inboxで署名検証が失格になった場合、キューを再試行しないようにしていたがするように
- admin/show-userで公開鍵(リモートユーザー)/秘密鍵公開鍵ペア(ローカルユーザー)を確認できるように
- updatePersonの後に発火するremoteUserUpdatedイベントにより、ApDbResolverServiceのpublicKeyキャッシュ
publicKeyByUserIdCacheをリフレッシュするように(ユーザーごと) - deliverでinboxに投げて401が返ってきた場合、時計が狂っている場合などを考慮しリトライできるように
- signature parseにおいてheaders.dateとサーバー時間のズレは両方向に300sを許容するように (headers.date - サーバー時間 <= 2000しか許容していなかったがこれだと問題が起きた)
Why
Ed25519は導入すべきなので
Additional info (optional)
CHANGELOG
- Feat: 連合に使うHTTP SignaturesがEd25519鍵に対応するように #13464
- Ed25519署名に対応するサーバーが増えると、deliverで要求されるサーバーリソースが削減されます
- ジョブキューのconfig設定のデフォルト値を変更しました。
default.ymlでジョブキューの並列度を設定している場合は、従前よりもconcurrencyの値をより下げるとパフォーマンスが改善する可能性があります。- deliverJobConcurrency: 16 (←128)
- deliverJobPerSec: 1024 (←128)
- inboxJobConcurrency: 4 (←16)
- inboxJobPerSec: 64 (←32)
- ジョブキューのconfig設定のデフォルト値を変更しました。
- Ed25519署名に対応するサーバーが増えると、deliverで要求されるサーバーリソースが削減されます
Checklist
- [x] Read the contribution guide
- [x] Test working in a local environment
- [ ] (If needed) Add story of storybook
- [x] (If needed) Update CHANGELOG.md
- [ ] (If possible) Add tests
Codecov Report
Attention: Patch coverage is 37.56345% with 615 lines in your changes missing coverage. Please review.
Project coverage is 41.66%. Comparing base (
763c708) to head (40756dc). Report is 1164 commits behind head on develop.
Additional details and impacted files
@@ Coverage Diff @@
## develop #14278 +/- ##
===========================================
+ Coverage 39.97% 41.66% +1.68%
===========================================
Files 1561 1564 +3
Lines 197358 203506 +6148
Branches 3611 3677 +66
===========================================
+ Hits 78889 84784 +5895
- Misses 117897 118117 +220
- Partials 572 605 +33
:umbrella: View full report in Codecov by Sentry.
:loudspeaker: Have feedback on the report? Share it here.
:rocket: New features to boost your workflow:
- :snowflake: Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
- :package: JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.
このPRによるapi.jsonの差分
差分はこちら
--- base
+++ head
@@ -13130,6 +13130,67 @@
"roleId"
]
}
+ },
+ "publicKeys": {
+ "type": [
+ "array",
+ "null"
+ ],
+ "items": {
+ "type": "object",
+ "properties": {
+ "userId": {
+ "type": "string"
+ },
+ "keyId": {
+ "type": "string"
+ },
+ "keyPem": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "userId",
+ "keyId",
+ "keyPem"
+ ]
+ }
+ },
+ "keyPairs": {
+ "type": [
+ "object",
+ "null"
+ ],
+ "properties": {
+ "userId": {
+ "type": "string"
+ },
+ "publicKey": {
+ "type": "string"
+ },
+ "privateKey": {
+ "type": "string"
+ },
+ "ed25519PublicKey": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "ed25519PrivateKey": {
+ "type": [
+ "string",
+ "null"
+ ]
+ }
+ },
+ "required": [
+ "userId",
+ "publicKey",
+ "privateKey",
+ "ed25519PublicKey",
+ "ed25519PrivateKey"
+ ]
}
},
"required": [
@@ -13156,7 +13217,9 @@
"signins",
"policies",
"roles",
- "roleAssigns"
+ "roleAssigns",
+ "publicKeys",
+ "keyPairs"
]
}
}
@@ -81086,6 +81149,9 @@
"string",
"null"
]
+ },
+ "httpMessageSignaturesImplementationLevel": {
+ "type": "string"
}
},
"required": [
@@ -81113,7 +81179,8 @@
"faviconUrl",
"themeColor",
"infoUpdatedAt",
- "latestRequestReceivedAt"
+ "latestRequestReceivedAt",
+ "httpMessageSignaturesImplementationLevel"
]
},
"GalleryPost": {
https://github.com/misskey-dev/misskey/issues/14273#issuecomment-2240958739
https://github.com/misskey-dev/misskey/pull/14278/commits/dd41dd0da566bdee5937647524e9b525bec04983 でremoteUserUpdatedが来た場合にpublicKeyキャッシュをパージするようにした
オフトピ: https://github.com/misskey-dev/misskey/issues/13518 を思い出した
(色々ごちゃごちゃ更新はしてるけどクリティカルなバグを見つけられてない
https://github.com/misskey-dev/misskey/issues/14273#issuecomment-2241241245, 88085fd
deliverでinboxに投げて401が返ってきた場合、時計が狂っている場合があるためリトライするようにした
コード斜め読みしてたら見つけたので一応上げておきます
キューイング直前でいらんデータを弾くようにしたいのでこのままがいいかも…
conflict resolved
キューイング直前でいらんデータを弾くようにしたいのでこのままがいいかも…
いやキューデータ定義はPrivateKeyWithPemなのでこれでいいのかしら
conflict resolved? (UserSuspendServiceが怪しい)
UserSuspendServiceが怪しい
大丈夫そう
conflict resolved?
~~ApRequestServiceにTODO発見~~
これはええねん
api.jsonの差分作成中にエラーが発生しました。詳細はWorkflowのログを確認してください。
conflict resolved?
conflict resolved
Conflict resolved;
- enableStatsForFederatedInstances: falseである場合、
httpMessageSignaturesImplementationLevelは常に00(RSA署名を使用)と扱うため、このPRの効果が期待できません。
初回の連合時にhttpMessageSignaturesImplementationLevelを取得するようにすればよさそう
初回の連合時に
既存の連合には効果ないとこのPRはあんまり意味ないと思っており
(オフトピ: そもそもenableStatsForFederatedInstances: falseにする目的があんまりわかってない、これでそこまでパフォーマンスが上がると思えず
既存の連合には効果ない
1%くらいの確率で情報を再取得するようにするとか
(オフトピ: そもそもenableStatsForFederatedInstances: falseにする目的があんまりわかってない、これでそこまでパフォーマンスが上がると思えず
deliverやinboxの処理が行われるたびにレコードのupdateが走るのは重いわね
deliverやinboxの処理が行われるたびにレコードのupdateが走る
isNotRespondingとnotRespondingSinceでupdateしてるだけなのか…
TODO: test-federationかく