misskey icon indicating copy to clipboard operation
misskey copied to clipboard

perf(federation): (re) Ed25519署名に対応する

Open tamaina opened this issue 1 year ago • 22 comments

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)

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

tamaina avatar Jul 20 '24 15:07 tamaina

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.

Files with missing lines Patch % Lines
...ackend/src/core/activitypub/ApDbResolverService.ts 28.57% 110 Missing :warning:
packages/backend/src/core/UserKeypairService.ts 39.59% 90 Missing :warning:
...end/src/core/activitypub/models/ApPersonService.ts 16.84% 79 Missing :warning:
...kend/src/queue/processors/InboxProcessorService.ts 2.66% 73 Missing :warning:
...nd/src/core/activitypub/ApDeliverManagerService.ts 21.68% 65 Missing :warning:
...ges/backend/src/server/ActivityPubServerService.ts 7.89% 35 Missing :warning:
...s/backend/src/core/activitypub/ApRequestService.ts 61.79% 34 Missing :warning:
...nd/src/queue/processors/DeliverProcessorService.ts 0.00% 29 Missing :warning:
packages/backend/src/queue/types.ts 0.00% 21 Missing :warning:
...s/backend/src/core/FetchInstanceMetadataService.ts 62.50% 15 Missing :warning:
... and 15 more
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.

codecov[bot] avatar Jul 20 '24 15:07 codecov[bot]

この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": {

Get diff files from Workflow Page

github-actions[bot] avatar Jul 20 '24 15:07 github-actions[bot]

https://github.com/misskey-dev/misskey/issues/14273#issuecomment-2240958739

https://github.com/misskey-dev/misskey/pull/14278/commits/dd41dd0da566bdee5937647524e9b525bec04983 でremoteUserUpdatedが来た場合にpublicKeyキャッシュをパージするようにした

tamaina avatar Jul 20 '24 16:07 tamaina

オフトピ: https://github.com/misskey-dev/misskey/issues/13518 を思い出した

tamaina avatar Jul 20 '24 16:07 tamaina

(色々ごちゃごちゃ更新はしてるけどクリティカルなバグを見つけられてない

tamaina avatar Jul 20 '24 16:07 tamaina

https://github.com/misskey-dev/misskey/issues/14273#issuecomment-2241241245, 88085fd

deliverでinboxに投げて401が返ってきた場合、時計が狂っている場合があるためリトライするようにした

tamaina avatar Jul 20 '24 17:07 tamaina

コード斜め読みしてたら見つけたので一応上げておきます

キューイング直前でいらんデータを弾くようにしたいのでこのままがいいかも…

tamaina avatar Jul 31 '24 02:07 tamaina

conflict resolved

tamaina avatar Jul 31 '24 02:07 tamaina

キューイング直前でいらんデータを弾くようにしたいのでこのままがいいかも…

いやキューデータ定義はPrivateKeyWithPemなのでこれでいいのかしら

tamaina avatar Jul 31 '24 02:07 tamaina

conflict resolved? (UserSuspendServiceが怪しい)

tamaina avatar Aug 17 '24 04:08 tamaina

UserSuspendServiceが怪しい

大丈夫そう

tamaina avatar Aug 17 '24 05:08 tamaina

conflict resolved?

tamaina avatar Aug 18 '24 10:08 tamaina

~~ApRequestServiceにTODO発見~~

これはええねん

tamaina avatar Aug 18 '24 10:08 tamaina

api.jsonの差分作成中にエラーが発生しました。詳細はWorkflowのログを確認してください。

github-actions[bot] avatar Sep 21 '24 11:09 github-actions[bot]

conflict resolved?

tamaina avatar Sep 24 '24 09:09 tamaina

conflict resolved

tamaina avatar Sep 29 '24 00:09 tamaina

Conflict resolved;

  • enableStatsForFederatedInstances: falseである場合、httpMessageSignaturesImplementationLevelは常に00 (RSA署名を使用)と扱うため、このPRの効果が期待できません。

tamaina avatar Oct 15 '24 01:10 tamaina

初回の連合時にhttpMessageSignaturesImplementationLevelを取得するようにすればよさそう

syuilo avatar Oct 15 '24 01:10 syuilo

初回の連合時に

既存の連合には効果ないとこのPRはあんまり意味ないと思っており

(オフトピ: そもそもenableStatsForFederatedInstances: falseにする目的があんまりわかってない、これでそこまでパフォーマンスが上がると思えず

tamaina avatar Oct 15 '24 01:10 tamaina

既存の連合には効果ない

1%くらいの確率で情報を再取得するようにするとか

syuilo avatar Oct 15 '24 01:10 syuilo

(オフトピ: そもそもenableStatsForFederatedInstances: falseにする目的があんまりわかってない、これでそこまでパフォーマンスが上がると思えず

deliverやinboxの処理が行われるたびにレコードのupdateが走るのは重いわね

syuilo avatar Oct 15 '24 01:10 syuilo

deliverやinboxの処理が行われるたびにレコードのupdateが走る

isNotRespondingとnotRespondingSinceでupdateしてるだけなのか…

tamaina avatar Oct 15 '24 01:10 tamaina

TODO: test-federationかく

tamaina avatar Oct 29 '24 13:10 tamaina