{"id":17711113,"url":"https://github.com/deejay-hub/openai-data-loss-prevention","last_synced_at":"2025-05-07T11:20:26.821Z","repository":{"id":226508223,"uuid":"754856876","full_name":"deejay-hub/openai-data-loss-prevention","owner":"deejay-hub","description":"Flex gateway policy that uses Microsoft Presidio to check for sensitive data in the request","archived":false,"fork":false,"pushed_at":"2024-03-07T23:21:17.000Z","size":540,"stargazers_count":4,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-31T09:22:31.060Z","etag":null,"topics":["flexgateway","flexgateway-custom-policy","mulesoft"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/deejay-hub.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2024-02-08T22:22:38.000Z","updated_at":"2025-01-15T05:22:35.000Z","dependencies_parsed_at":"2024-03-08T00:26:32.886Z","dependency_job_id":"fa083bf4-1cd9-49ae-aff6-3b9a37987ed8","html_url":"https://github.com/deejay-hub/openai-data-loss-prevention","commit_stats":null,"previous_names":["deejay-hub/openai-data-loss-prevention"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deejay-hub%2Fopenai-data-loss-prevention","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deejay-hub%2Fopenai-data-loss-prevention/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deejay-hub%2Fopenai-data-loss-prevention/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deejay-hub%2Fopenai-data-loss-prevention/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/deejay-hub","download_url":"https://codeload.github.com/deejay-hub/openai-data-loss-prevention/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252866001,"owners_count":21816373,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["flexgateway","flexgateway-custom-policy","mulesoft"],"created_at":"2024-10-25T07:44:35.997Z","updated_at":"2025-05-07T11:20:26.792Z","avatar_url":"https://github.com/deejay-hub.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\t\u003cimg\n\twidth=\"80\"\n\tsrc=\"/images/mulesoft-logo.png\"\u003e\n\t\u003ch1\u003eOpenAI Data Loss Prevention Policy\u003c/h1\u003e\n\u003c/div\u003e\n\n\u003ch4 align=\"center\"\u003e\n\t\u003ca href=\"#overview\"\u003eOverview\u003c/a\u003e |\n\t\u003ca href=\"#try-it\"\u003eTry It\u003c/a\u003e |\n  \u003ca href=\"#make-command-reference\"\u003eMake Reference\u003c/a\u003e\n\u003c/h4\u003e\n\n## Overview\n\nThis policy was created with the Flex Gateway Policy Development Kit (PDK). To find the complete PDK documentation, see [PDK Overview](https://docs.mulesoft.com/pdk/latest/policies-pdk-overview) on the MuleSoft documentation site.\n\nThe policy has the following properties \n\n| Property                                   | Description                                                                                                 | Type                                   |\n| ------------------------------------------ | ------------------------------------------------------------------------------------------------------------| -------------------------------------- |\n| `presidio-analysis-service`                | The Presidio Analyze service location running in Docker                                                     | String    \n| `langauge`                                 | The language used by Presidio in ISO-639-1 format                                                           | String    \n| `score_threshold`                          | The score threshold in Presidio for it to be flagged as sensitive (0-1)                                     | String    \n| `entities`                                 | An array of entities to look for in the OpenAI request                                                      | Array    \n| `action`                                   | Log - Log sensitive data but continue or Reject - if sensitive data found return 401 (Unauthorized)         | String    \n\n\n### Example\n\nWhen calling the OpenAI API a user will potentially include sensitive data in the prompt.\n\nHowever, with Flex gateway being used and openai.api.com as the upstream api we can intercept the request and use pii checking utilities to look for sensitive data. In this case [Microsoft's Presidio](https://microsoft.github.io/presidio/).\n\nThis policy assumes you have already added your OpenAI API key to the request header. You can do this in your http client or use the policy [Open API Key Management Policy](https://github.com/deejay-hub/openai-api-key-mgmt)\n\n```\n\u003e  curl http://localhost:8081/chat/completions \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"model\": \"gpt-3.5-turbo\",\n    \"messages\": [\n      {\n        \"role\": \"system\",\n        \"content\": \"You are an assistant, skilled in explaining MuleSoft concepts with creative flair. Keep responses free from bias and without obsenities\"\n      },\n      {\n        \"role\": \"user\",\n        \"content\": \"create a poem in less than 10 words about Max Mule\"\n      }\n    ]\n  }'\n  \n```\n\nWith the policy applied the API returns Unauthorized 401\n```\nYour OpenAI request has sensitive data:\nPERSON at 42,50: with certainty 0.85\n```\n\n## Try It\nThese setup steps use Flex Gateway in connected mode running locally on a Mac. Make sure you have docker desktop installed.\n\n### Flex Gateway\nStep 1. Follow the instructions [here](https://github.com/deejay-hub/openai-api-key-mgmt) to get Flex Gateway up and running with openai.api.com/v1 as the upstream endpoint.\n\nStep 2. Install Microsoft Presidio using Docker\n\n```\ndocker pull mcr.microsoft.com/presidio-analyzer\n```\n\n```\ndocker run -d -p 5001:3000 mcr.microsoft.com/presidio-analyzer:latest\n```\n\nThis will run Presidio's analyzer using the default port 5001.\n\nStep 3. Verify Presidio is running correctly by running the following curl command\n\n```\ncurl -X POST http://localhost:5001/analyze -H \"Content-type: application/json\" --data \"{ \\\"text\\\": \\\"John Smith drivers license is A123456\\\", \\\"language\\\" : \\\"en\\\"}\"\n```\n\nIf the service is running you will get the response that responds with a match for name and drivers licence.\n```\n[{\"analysis_explanation\": null, \"end\": 10, \"entity_type\": \"PERSON\", \"recognition_metadata\": {\"recognizer_identifier\": \"SpacyRecognizer_140733976679664\", \"recognizer_name\": \"SpacyRecognizer\"}, \"score\": 0.85, \"start\": 0}, {\"analysis_explanation\": null, \"end\": 37, \"entity_type\": \"US_DRIVER_LICENSE\", \"recognition_metadata\": {\"recognizer_identifier\": \"UsLicenseRecognizer_140733983661648\", \"recognizer_name\": \"UsLicenseRecognizer\"}, \"score\": 0.6499999999999999, \"start\": 30}]%\n```\n\nStep 3. Download this policy and use `make build` then `make release`.\n\nStep 4. Apply the policy in API Manager to the API created in Step 1. Leave all default options set.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg alt=\"policy-config\" src=\"images/policy-config.png\"\u003e\n\u003c/p\u003e\n\nStep 5. With the policy applied with default settings any prompt data with name, drivers licence, credit card, email addresses or phone numbers will be rejected. Other options you can add include\n- CRYPTO\n- DATE_TIME\n- IBAN_CODE\n- IP_ADDRESS\n- LOCATION\n- MEDICAL_LICENSE\n- URL\n- US_BANK_NUMBER\n- US_ITIN\n- UK_NHS\nand more all documented [here](https://microsoft.github.io/presidio/supported_entities/).\n\nTo test it you can use the following:\n\nThe following request should be okay since it contains no PII.\n```\ncurl -X POST http://localhost:8081/flex-api/chat/completions   -H \"Content-Type: application/json\"  -d '{\n    \"model\": \"gpt-3.5-turbo\",\n    \"messages\": [\n      {\n        \"role\": \"system\",\n        \"content\": \"You are an assistant, skilled in explaining MuleSoft concepts with creative flair. Keep responses free from bias and without obsenities.\"\n      },\n      {\n        \"role\": \"user\",\n        \"content\": \"Compose a poem in less than 10 words.\"\n      }\n    ]\n  }'\n```\nThe following request should fail since we added a name\n\n```\ncurl -X POST http://localhost:8081/flex-api/chat/completions   -H \"Content-Type: application/json\"  -d '{\n    \"model\": \"gpt-3.5-turbo\",\n    \"messages\": [\n      {\n        \"role\": \"system\",\n        \"content\": \"You are an assistant, skilled in explaining MuleSoft concepts with creative flair. Keep responses free from bias and without obsenities.\"\n      },\n      {\n        \"role\": \"user\",\n        \"content\": \"Compose a poem in less than 10 words about Max Mule.\"\n      }\n    ]\n  }'\n```\nThis should reply with the Unauthorized 401 response\n```\nYour OpenAI request has sensitive data:\nPERSON at 43,51: with certainty 0.85%\n```\n\n## Make command reference\nThis project has a Makefile that includes different goals that assist the developer during the policy development lifecycle.\n\n*For more information about the Makefile, see [Makefile](https://docs.mulesoft.com/pdk/latest/policies-pdk-create-project#makefile).*\n\n### Setup\nThe `make setup` goal installs the Policy Development Kit internal dependencies for the rest of the Makefile goals.\nSince these dependencies are provided by the Anypoint Platform, it requires the user to be authenticated with a set of valid Anypoint credentials.\n\n*For more information about `make setup`, see [Setup the PDK Build environment](https://docs.mulesoft.com/pdk/latest/policies-pdk-create-project#setup-the-pdk-build-environment).*\n\n### Build asset files\nThe `make build-asset-files` goal generates all the policy asset files required to build, execute, and publish the policy. This command also updates the `config.rs` source code file with the latest configurations defined in the policy definition.\n\n*For more information about creating a policy definition, see [Defining a Policy Schema Definition](https://docs.mulesoft.com/pdk/latest/policies-pdk-create-schema-definition).*\n\n*For more information about `make build-asset-files`, see [Compiling Custom Policies](https://docs.mulesoft.com/pdk/latest/policies-pdk-compile-policies).*\n\n### Build\nThe `make build` goal compiles the WebAssembly binary of the policy.\nSince the source code must be in sync with the policy definition configurations, this goal runs the `build-asset-files` before compiling.\n\n*For more information about `make build`, see [Compiling Custom Policies](https://docs.mulesoft.com/pdk/latest/policies-pdk-compile-policies).*\n\n### Run\nThe `make run` goal provides a simple way to execute the current build of the policy in a Docker containerized environment. In order to run this goal, the `playground/config` directory must contain a set of files required for executing the policy in a Flex Gateway instance:\n- A `registration.yaml` file generated by performing a Flex Gateway registration in Local Mode. If you already have an instance registered in Local mode, you can reuse the registration file you have and copy it in the `playground/config` folder.\nOtherwise, to complete the registration we recommend using the Anypoint Platform:\n    1. Go to `Runtime Manager`\n    2. Navigate to the `Flex Gateway` tab\n    3. Click the `Add Gateway` button\n    4. Select `Docker` as your OS and copy the registration command replacing `--connected=true` to `--connected=false`.\n    5. Paste the command and run it in the `playground/config` directory.\n\n- An `api.yaml` file updated with the desired policy configuration. This file also supports adding other policies to be applied along the one being developed.\n\nThe `playground/config` directory can also contain other resource definitions, such as accessory services used by the policy (Eg. a remote authentication service).\n\n*For more information about `make run`, see [Debugging Custom Policies Locally with PDK](https://docs.mulesoft.com/pdk/latest/policies-pdk-debug-local).*\n\n### Test\nThe `make test` goal runs unit tests and integration tests. Integration tests are placed in the `tests` directory and are configured with the files placed at the\n`tests/\u003cmodule-name\u003e/\u003ctest-name\u003e` directory.\n\n*For more information about writing integration tests, see [Writing Integration Tests](https://docs.mulesoft.com/pdk/latest/policies-pdk-integration-tests).*\n\n### Publish\nThe `make publish` goal publishes the policy asset in Anypoint Exchange, in your configured Organization.\n\nSince the publish goal is intended to publish a policy asset in development, the _assetId_ and name published will explicitly say `dev`, and the versions published will include a timestamp at the end of the version. Eg.\n- groupId: your configured organization id\n- visible name: _{Your policy name} Dev_\n- assetId: _{your-policy-asset-id}-dev_\n- version: _{your-policy-version}-20230618115723_\n\n*For more information about publishing policies, see [Uploading Custom Policies to Exchange](https://docs.mulesoft.com/pdk/latest/policies-pdk-publish-policies).*\n\n### Release\nThe `make release` goal also publishes the policy to Anypoint Exchange, but as a ready for production asset. In this case, the groupId, visible name, assetId and version will be the ones defined in the project.\n\n*For more information about releasing policies, see [Uploading Custom Policies to Exchange](https://docs.mulesoft.com/pdk/latest/policies-pdk-publish-policies).*\n\n\n### Policy Examples\n\nThe PDK provides provides a set of example policy projects to get started creating policies and using the PDK features. To learn more about these examples see [Custom policy Examples](https://docs.mulesoft.com/pdk/latest/policies-pdk-policy-templates).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdeejay-hub%2Fopenai-data-loss-prevention","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdeejay-hub%2Fopenai-data-loss-prevention","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdeejay-hub%2Fopenai-data-loss-prevention/lists"}