keep sensitive credentials out of logs
authorJustin Wind <justin.wind+git@gmail.com>
Fri, 5 Nov 2021 00:51:20 +0000 (17:51 -0700)
committerJustin Wind <justin.wind+git@gmail.com>
Fri, 5 Nov 2021 00:51:20 +0000 (17:51 -0700)
src/logger.js
src/service.js
test/src/logger.js

index 934c7dadd24868bd52ebd3826c022ea715a89365..00edfb8bcc0ceae419bd5e54a47bc0bb9b8684c9 100644 (file)
@@ -66,6 +66,14 @@ class Logger {
   }
 
   payload(level, scope, message, data, ...other) {
+    // Try to keep credentials out of logs.
+    // This approach feels sort of jank, but it's better than nothing, for now.
+    if (data && data.ctx && data.ctx.parsedBody && data.ctx.parsedBody.credential) {
+      // Create copy of data
+      data = JSON.parse(JSON.stringify(data));
+      data.ctx.parsedBody.credential = '*'.repeat(data.ctx.parsedBody.credential.length);
+    }
+
     const now = new Date();
     return JSON.stringify({
       nodeId: this.nodeId,
index 1d9b8a0922af1b8699e7232fd078b5f244a66f8e..a0043f7d24caa49a71c85341dc4fadca6ea563d2 100644 (file)
@@ -181,8 +181,9 @@ class Service extends Dingus {
 
 
   /**
-   * Same as super.ingestBody, but if no body was sent, do not parse (and
+   * Similar to super.ingestBody, but if no body was sent, do not parse (and
    * thus avoid possible unsupported media type error).
+   * Also removes raw body from context, to simplify scrubbing sensitive data from logs.
    * @param {http.ClientRequest} req
    * @param {http.ServerResponse} res
    * @param {Object} ctx
@@ -192,6 +193,7 @@ class Service extends Dingus {
     const contentType = Dingus.getRequestContentType(req);
     if (ctx.rawBody) {
       this.parseBody(contentType, ctx);
+      delete ctx.rawBody;
     }
   }
 
index 2a205042f9b017df28980f206698e39817dca9fe..fc602aaec85eb086a4ac446b4f97fd5b7b16ef48 100644 (file)
@@ -48,4 +48,17 @@ describe('Logger', function () {
     logger = new Logger(config);
     logger.info();
   });
+
+  it('masks credentials', function () {
+    logger = new Logger(config);
+    logger.info('testScope', 'message', {
+      ctx: {
+        parsedBody: {
+          identity: 'username',
+          credential: 'password',
+        },
+      },
+    });
+  });
+
 }); // Logger