wfe: remove Payload from logs (#6639)
Also remove CSRDNSNames, CSRIPAddresses and CSREmailAddresses. And add a new log field "DNSNames", for use in new-order, finalize, and revoke requests. Add a "RevocationReason" field in the "Extra" section for revoke requests.
This commit is contained in:
		
							parent
							
								
									134321040b
								
							
						
					
					
						commit
						67927390e7
					
				| 
						 | 
				
			
			@ -39,9 +39,8 @@ type RequestEvent struct {
 | 
			
		|||
	Contacts       []string `json:",omitempty"`
 | 
			
		||||
	UserAgent      string   `json:"ua,omitempty"`
 | 
			
		||||
	// Origin is sent by the browser from XHR-based clients.
 | 
			
		||||
	Origin  string                 `json:",omitempty"`
 | 
			
		||||
	Payload string                 `json:",omitempty"`
 | 
			
		||||
	Extra   map[string]interface{} `json:",omitempty"`
 | 
			
		||||
	Origin string                 `json:",omitempty"`
 | 
			
		||||
	Extra  map[string]interface{} `json:",omitempty"`
 | 
			
		||||
 | 
			
		||||
	// For endpoints that create objects, the ID of the newly created object.
 | 
			
		||||
	Created string `json:",omitempty"`
 | 
			
		||||
| 
						 | 
				
			
			@ -49,8 +48,12 @@ type RequestEvent struct {
 | 
			
		|||
	// For challenge and authorization GETs and POSTs:
 | 
			
		||||
	// the status of the authorization at the time the request began.
 | 
			
		||||
	Status string `json:",omitempty"`
 | 
			
		||||
	// The DNS name, if applicable
 | 
			
		||||
	// The DNS name, if there is a single relevant name, for instance
 | 
			
		||||
	// in an authorization or challenge request.
 | 
			
		||||
	DNSName string `json:",omitempty"`
 | 
			
		||||
	// The set of DNS names, if there are potentially multiple relevant
 | 
			
		||||
	// names, for instance in a new-order, finalize, or revoke request.
 | 
			
		||||
	DNSNames []string `json:",omitempty"`
 | 
			
		||||
 | 
			
		||||
	// For challenge POSTs, the challenge type.
 | 
			
		||||
	ChallengeType string `json:",omitempty"`
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -517,8 +517,7 @@ func (wfe *WebFrontEndImpl) validJWSForKey(
 | 
			
		|||
	ctx context.Context,
 | 
			
		||||
	jws *jose.JSONWebSignature,
 | 
			
		||||
	jwk *jose.JSONWebKey,
 | 
			
		||||
	request *http.Request,
 | 
			
		||||
	logEvent *web.RequestEvent) ([]byte, *probs.ProblemDetails) {
 | 
			
		||||
	request *http.Request) ([]byte, *probs.ProblemDetails) {
 | 
			
		||||
 | 
			
		||||
	// Check that the public key and JWS algorithms match expected
 | 
			
		||||
	err := checkAlgorithm(jwk, jws)
 | 
			
		||||
| 
						 | 
				
			
			@ -538,9 +537,6 @@ func (wfe *WebFrontEndImpl) validJWSForKey(
 | 
			
		|||
		wfe.stats.joseErrorCount.With(prometheus.Labels{"type": "JWSVerifyFailed"}).Inc()
 | 
			
		||||
		return nil, probs.Malformed("JWS verification error")
 | 
			
		||||
	}
 | 
			
		||||
	// Store the verified payload in the logEvent
 | 
			
		||||
	logEvent.Payload = string(payload)
 | 
			
		||||
	beeline.AddFieldToTrace(ctx, "payload", string(payload))
 | 
			
		||||
 | 
			
		||||
	// Check that the JWS contains a correct Nonce header
 | 
			
		||||
	if prob := wfe.validNonce(ctx, jws); prob != nil {
 | 
			
		||||
| 
						 | 
				
			
			@ -586,7 +582,7 @@ func (wfe *WebFrontEndImpl) validJWSForAccount(
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	// Verify the JWS with the JWK from the SA
 | 
			
		||||
	payload, prob := wfe.validJWSForKey(ctx, jws, pubKey, request, logEvent)
 | 
			
		||||
	payload, prob := wfe.validJWSForKey(ctx, jws, pubKey, request)
 | 
			
		||||
	if prob != nil {
 | 
			
		||||
		return nil, nil, nil, prob
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -658,8 +654,7 @@ func (wfe *WebFrontEndImpl) validPOSTAsGETForAccount(
 | 
			
		|||
func (wfe *WebFrontEndImpl) validSelfAuthenticatedJWS(
 | 
			
		||||
	ctx context.Context,
 | 
			
		||||
	jws *jose.JSONWebSignature,
 | 
			
		||||
	request *http.Request,
 | 
			
		||||
	logEvent *web.RequestEvent) ([]byte, *jose.JSONWebKey, *probs.ProblemDetails) {
 | 
			
		||||
	request *http.Request) ([]byte, *jose.JSONWebKey, *probs.ProblemDetails) {
 | 
			
		||||
	// Extract the embedded JWK from the parsed JWS
 | 
			
		||||
	pubKey, prob := wfe.extractJWK(jws)
 | 
			
		||||
	if prob != nil {
 | 
			
		||||
| 
						 | 
				
			
			@ -667,7 +662,7 @@ func (wfe *WebFrontEndImpl) validSelfAuthenticatedJWS(
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	// Verify the JWS with the embedded JWK
 | 
			
		||||
	payload, prob := wfe.validJWSForKey(ctx, jws, pubKey, request, logEvent)
 | 
			
		||||
	payload, prob := wfe.validJWSForKey(ctx, jws, pubKey, request)
 | 
			
		||||
	if prob != nil {
 | 
			
		||||
		return nil, nil, prob
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -680,8 +675,7 @@ func (wfe *WebFrontEndImpl) validSelfAuthenticatedJWS(
 | 
			
		|||
// goodkey policies (key algorithm, length, blocklist, etc).
 | 
			
		||||
func (wfe *WebFrontEndImpl) validSelfAuthenticatedPOST(
 | 
			
		||||
	ctx context.Context,
 | 
			
		||||
	request *http.Request,
 | 
			
		||||
	logEvent *web.RequestEvent) ([]byte, *jose.JSONWebKey, *probs.ProblemDetails) {
 | 
			
		||||
	request *http.Request) ([]byte, *jose.JSONWebKey, *probs.ProblemDetails) {
 | 
			
		||||
	// Parse the JWS from the POST request
 | 
			
		||||
	jws, prob := wfe.parseJWSRequest(request)
 | 
			
		||||
	if prob != nil {
 | 
			
		||||
| 
						 | 
				
			
			@ -689,7 +683,7 @@ func (wfe *WebFrontEndImpl) validSelfAuthenticatedPOST(
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	// Extract and validate the embedded JWK from the parsed JWS
 | 
			
		||||
	payload, pubKey, prob := wfe.validSelfAuthenticatedJWS(ctx, jws, request, logEvent)
 | 
			
		||||
	payload, pubKey, prob := wfe.validSelfAuthenticatedJWS(ctx, jws, request)
 | 
			
		||||
	if prob != nil {
 | 
			
		||||
		return nil, nil, prob
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1295,14 +1295,12 @@ func TestValidJWSForKey(t *testing.T) {
 | 
			
		|||
	for _, tc := range testCases {
 | 
			
		||||
		t.Run(tc.Name, func(t *testing.T) {
 | 
			
		||||
			wfe.stats.joseErrorCount.Reset()
 | 
			
		||||
			inputLogEvent := newRequestEvent()
 | 
			
		||||
			request := makePostRequestWithPath("test", tc.Body)
 | 
			
		||||
			outPayload, prob := wfe.validJWSForKey(context.Background(), tc.JWS, tc.JWK, request, inputLogEvent)
 | 
			
		||||
			outPayload, prob := wfe.validJWSForKey(context.Background(), tc.JWS, tc.JWK, request)
 | 
			
		||||
 | 
			
		||||
			if tc.ExpectedProblem == nil && prob != nil {
 | 
			
		||||
				t.Fatalf("Expected nil problem, got %#v\n", prob)
 | 
			
		||||
			} else if tc.ExpectedProblem == nil {
 | 
			
		||||
				test.AssertEquals(t, inputLogEvent.Payload, payload)
 | 
			
		||||
				test.AssertEquals(t, string(outPayload), payload)
 | 
			
		||||
			} else {
 | 
			
		||||
				test.AssertMarshaledEquals(t, prob, tc.ExpectedProblem)
 | 
			
		||||
| 
						 | 
				
			
			@ -1397,7 +1395,6 @@ func TestValidPOSTForAccount(t *testing.T) {
 | 
			
		|||
			if tc.ExpectedProblem == nil && prob != nil {
 | 
			
		||||
				t.Fatalf("Expected nil problem, got %#v\n", prob)
 | 
			
		||||
			} else if tc.ExpectedProblem == nil {
 | 
			
		||||
				test.AssertEquals(t, inputLogEvent.Payload, tc.ExpectedPayload)
 | 
			
		||||
				test.AssertEquals(t, string(outPayload), tc.ExpectedPayload)
 | 
			
		||||
				test.AssertMarshaledEquals(t, acct, tc.ExpectedAcct)
 | 
			
		||||
				test.AssertMarshaledEquals(t, jws, tc.ExpectedJWS)
 | 
			
		||||
| 
						 | 
				
			
			@ -1437,7 +1434,6 @@ func TestValidPOSTAsGETForAccount(t *testing.T) {
 | 
			
		|||
			ExpectedProblem: probs.Malformed("POST-as-GET requests must have an empty payload"),
 | 
			
		||||
			ExpectedLogEvent: web.RequestEvent{
 | 
			
		||||
				Contacts: []string{"mailto:person@mail.com"},
 | 
			
		||||
				Payload:  "{}",
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
| 
						 | 
				
			
			@ -1544,15 +1540,13 @@ func TestValidSelfAuthenticatedPOST(t *testing.T) {
 | 
			
		|||
	for _, tc := range testCases {
 | 
			
		||||
		t.Run(tc.Name, func(t *testing.T) {
 | 
			
		||||
			wfe.stats.joseErrorCount.Reset()
 | 
			
		||||
			inputLogEvent := newRequestEvent()
 | 
			
		||||
			outPayload, jwk, prob := wfe.validSelfAuthenticatedPOST(context.Background(), tc.Request, inputLogEvent)
 | 
			
		||||
			outPayload, jwk, prob := wfe.validSelfAuthenticatedPOST(context.Background(), tc.Request)
 | 
			
		||||
			if tc.ExpectedProblem == nil && prob != nil {
 | 
			
		||||
				t.Fatalf("Expected nil problem, got %#v\n", prob)
 | 
			
		||||
			} else if tc.ExpectedProblem == nil {
 | 
			
		||||
				inThumb, _ := tc.ExpectedJWK.Thumbprint(crypto.SHA256)
 | 
			
		||||
				outThumb, _ := jwk.Thumbprint(crypto.SHA256)
 | 
			
		||||
				test.AssertDeepEquals(t, inThumb, outThumb)
 | 
			
		||||
				test.AssertEquals(t, inputLogEvent.Payload, tc.ExpectedPayload)
 | 
			
		||||
				test.AssertEquals(t, string(outPayload), tc.ExpectedPayload)
 | 
			
		||||
			} else {
 | 
			
		||||
				test.AssertMarshaledEquals(t, prob, tc.ExpectedProblem)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										21
									
								
								wfe2/wfe.go
								
								
								
								
							
							
						
						
									
										21
									
								
								wfe2/wfe.go
								
								
								
								
							| 
						 | 
				
			
			@ -616,7 +616,7 @@ func (wfe *WebFrontEndImpl) NewAccount(
 | 
			
		|||
	// NewAccount uses `validSelfAuthenticatedPOST` instead of
 | 
			
		||||
	// `validPOSTforAccount` because there is no account to authenticate against
 | 
			
		||||
	// until after it is created!
 | 
			
		||||
	body, key, prob := wfe.validSelfAuthenticatedPOST(ctx, request, logEvent)
 | 
			
		||||
	body, key, prob := wfe.validSelfAuthenticatedPOST(ctx, request)
 | 
			
		||||
	if prob != nil {
 | 
			
		||||
		// validSelfAuthenticatedPOST handles its own setting of logEvent.Errors
 | 
			
		||||
		wfe.sendError(response, logEvent, prob, nil)
 | 
			
		||||
| 
						 | 
				
			
			@ -815,6 +815,9 @@ func (wfe *WebFrontEndImpl) parseRevocation(
 | 
			
		|||
	// Compute and record the serial number of the provided certificate
 | 
			
		||||
	serial := core.SerialToString(parsedCertificate.SerialNumber)
 | 
			
		||||
	logEvent.Extra["CertificateSerial"] = serial
 | 
			
		||||
	if revokeRequest.Reason != nil {
 | 
			
		||||
		logEvent.Extra["RevocationReason"] = *revokeRequest.Reason
 | 
			
		||||
	}
 | 
			
		||||
	beeline.AddFieldToTrace(ctx, "cert.serial", serial)
 | 
			
		||||
 | 
			
		||||
	// Try to validate the signature on the provided cert using its corresponding
 | 
			
		||||
| 
						 | 
				
			
			@ -828,8 +831,8 @@ func (wfe *WebFrontEndImpl) parseRevocation(
 | 
			
		|||
	if err != nil {
 | 
			
		||||
		return nil, 0, probs.NotFound("No such certificate")
 | 
			
		||||
	}
 | 
			
		||||
	logEvent.Extra["CertificateDNSNames"] = parsedCertificate.DNSNames
 | 
			
		||||
	beeline.AddFieldToTrace(ctx, "cert.dnsnames", parsedCertificate.DNSNames)
 | 
			
		||||
	logEvent.DNSNames = parsedCertificate.DNSNames
 | 
			
		||||
	beeline.AddFieldToTrace(ctx, "dnsnames", parsedCertificate.DNSNames)
 | 
			
		||||
 | 
			
		||||
	if parsedCertificate.NotAfter.Before(wfe.clk.Now()) {
 | 
			
		||||
		return nil, 0, probs.Unauthorized("Certificate is expired")
 | 
			
		||||
| 
						 | 
				
			
			@ -916,7 +919,7 @@ func (wfe *WebFrontEndImpl) revokeCertByCertKey(
 | 
			
		|||
	// `validSelfAuthenticatedJWS` similar to new-reg and key rollover.
 | 
			
		||||
	// We do *not* use `validSelfAuthenticatedPOST` here because we've already
 | 
			
		||||
	// read the HTTP request body in `parseJWSRequest` and it is now empty.
 | 
			
		||||
	jwsBody, jwk, prob := wfe.validSelfAuthenticatedJWS(ctx, outerJWS, request, logEvent)
 | 
			
		||||
	jwsBody, jwk, prob := wfe.validSelfAuthenticatedJWS(ctx, outerJWS, request)
 | 
			
		||||
	if prob != nil {
 | 
			
		||||
		return prob
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -2035,6 +2038,8 @@ func (wfe *WebFrontEndImpl) NewOrder(
 | 
			
		|||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	logEvent.DNSNames = names
 | 
			
		||||
 | 
			
		||||
	order, err := wfe.ra.NewOrder(ctx, &rapb.NewOrderRequest{
 | 
			
		||||
		RegistrationID: acct.ID,
 | 
			
		||||
		Names:          names,
 | 
			
		||||
| 
						 | 
				
			
			@ -2230,12 +2235,8 @@ func (wfe *WebFrontEndImpl) FinalizeOrder(ctx context.Context, logEvent *web.Req
 | 
			
		|||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	logEvent.Extra["CSRDNSNames"] = csr.DNSNames
 | 
			
		||||
	beeline.AddFieldToTrace(ctx, "csr.dnsnames", csr.DNSNames)
 | 
			
		||||
	logEvent.Extra["CSREmailAddresses"] = csr.EmailAddresses
 | 
			
		||||
	beeline.AddFieldToTrace(ctx, "csr.email_addrs", csr.EmailAddresses)
 | 
			
		||||
	logEvent.Extra["CSRIPAddresses"] = csr.IPAddresses
 | 
			
		||||
	beeline.AddFieldToTrace(ctx, "csr.ip_addrs", csr.IPAddresses)
 | 
			
		||||
	logEvent.DNSNames = order.Names
 | 
			
		||||
	beeline.AddFieldToTrace(ctx, "dnsnames", csr.DNSNames)
 | 
			
		||||
	logEvent.Extra["KeyType"] = web.KeyTypeToString(csr.PublicKey)
 | 
			
		||||
	beeline.AddFieldToTrace(ctx, "csr.key_type", web.KeyTypeToString(csr.PublicKey))
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue