From af7860e1f796c8f365cae0ad81426bfda09d9894 Mon Sep 17 00:00:00 2001 From: Jonathan Williams Date: Wed, 17 Jan 2024 17:33:28 -0500 Subject: [PATCH 1/8] :pencil: add readme --- docs/image-resizing.md | 35 +++++++ docs/images/image-scaling-flow-diagram.png | Bin 0 -> 82201 bytes docs/images/request-flow-diagram.png | Bin 0 -> 65532 bytes docs/lambda-function-description.md | 12 +++ docs/protected-media.md | 53 ++++++++++ docs/x-forwarded-host-header.md | 7 ++ readme.md | 113 ++++++++++----------- 7 files changed, 159 insertions(+), 61 deletions(-) create mode 100644 docs/image-resizing.md create mode 100644 docs/images/image-scaling-flow-diagram.png create mode 100644 docs/images/request-flow-diagram.png create mode 100644 docs/lambda-function-description.md create mode 100644 docs/protected-media.md create mode 100644 docs/x-forwarded-host-header.md diff --git a/docs/image-resizing.md b/docs/image-resizing.md new file mode 100644 index 0000000..89600cf --- /dev/null +++ b/docs/image-resizing.md @@ -0,0 +1,35 @@ +# Image resizing + +Where WordPress normally generates all scaled derivates during file upload, this application provides a way to serve images at specific sizes without having to generate all of them in advance. This can result in significant storage and processing savings for WordPress sites with a large number of image sizes defined, but only a few of those sizes are used in the site. Only sizes that are actually requested will be generated and stored in the bucket. + +It also allows for original media to be stored separately from the scaled derivates, making it easier to manage very large media libraries. For example, when cloning sites for development or testing, the original media can be copied to the new site without having to copy all of the scaled versions. The scaled versions will be automatically generated when the media is requested. + +Custom crop controls are available with the image scaling, either through GET parameters to the image request or through custom image sizes defined in a WordPress theme. More detail is available in the [Custom Crop](./docs/custom-crop.md) documentation. + +The access controls are applied based on the path of the file, not the file name, so access controls are applied consistently across the original and any scaled versions of the file. + +The logic of the image scaling handler and how it relates to access control is described in the following diagram: +![Image scaling flow diagram](./images/image-scaling-flow-diagram.png) + +## WordPress compatible custom image sizes + +WordPress themes can define custom image sizes using the `add_image_size()` function. This function takes a `crop` parameter that determines if portions of the image should be removed to fit the custom size. The BU Media S3 WordPress plugin has a wp-cli command that can be used to push the custom image sizes defined in the theme to the DynamoDB table. These records use a primary key based on the site url and look like this: `SIZES#example.bu.edu/example-site`. + +The `getOrCreateObject()` function uses the `lookupCustomCrop()` function to load any custom sizes that may be defined for the site in the DynamoDB table. If there is a size that matches the dimensions of the requested image and that size has custom crop settings, then that crop parameter is added to the rewritten file name in S3. It is also passed to the `resizeAndSave()` function which passes it to the `sharp` library to perform the crop. + +By adding the crop parameter to the name of the object in S3, crop factors can change without causing a file name conflict. + +## Custom Crop Parameters + +In addition to crop parameters defined in WordPress themes, custom crop parameters can be added as GET parameters to the URL. For example, the following URL will crop the left part of an image: + +```text +https://example.bu.edu/example-site/files/2024/01/16/picture-800x300.jpg?resize-position=top +``` + +Currently only top, bottom, left, right are accepted as resize-position options + +## References + +- [Developer reference on add_image size() and the crop parameter](https://developer.wordpress.org/reference/functions/add_image_size/) +- [Sharp library resize position options](https://sharp.pixelplumbing.com/api-resize) diff --git a/docs/images/image-scaling-flow-diagram.png b/docs/images/image-scaling-flow-diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..14629552a17378daf261a1efe03475e524b2a689 GIT binary patch literal 82201 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 B?bBpK;HY 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 z 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 literal 0 HcmV?d00001 diff --git a/docs/images/request-flow-diagram.png b/docs/images/request-flow-diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..8a0d9c2a3a0e31ca5ac3ea07aec2aaa93beda0ca GIT binary patch literal 65532 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 Date: Wed, 17 Jan 2024 18:33:24 -0500 Subject: [PATCH 2/8] :pencil: move pre-signed keys to subsection --- docs/lambda-function-description.md | 6 ++++++ readme.md | 6 ------ 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/lambda-function-description.md b/docs/lambda-function-description.md index 64a23d4..93ec724 100644 --- a/docs/lambda-function-description.md +++ b/docs/lambda-function-description.md @@ -10,3 +10,9 @@ The code includes the following modules: The Lambda function (`app.js`) receives the details of the request from the event parameter, which contains the information for the native S3 WriteGetObjectResponse request. It first checks if the request is for a site on the protected sites list. It uses that information, combined with the path of the request to determine if the request is for a protected object. For protected objects, it runs the authorizeRequest module to check if the user is authorized to access the object. If the user is authorized or the object is unprotected, the `getOrCreateObject()` function retrieves the object from S3 or creates a sized version of the object if it doesn't exist. Finally, the Lambda function returns the image data with a 200 OK response or a 404 Not Found response if the image is not found. + +## S3 Object Lambda Pre-signed keys + +In typical usage, S3 Object Lambdas do not need direct read or write access to the S3 bucket. This is because the request event that the Lambda function receives contains a pre-signed that allows one-time read access directly without the need for additional credentials. + +In our case with image resizing involved, the original request may be rewritted for a different location (sized media are stored in a different location than original media for example). Also the scaled media object may not yet exist. For these reasons, we side-step the pre-signed key and use the AWS SDK to get the object directly from S3, at the potentially rewritten location. The Lambda is also granted write access to the bucket, so that it can save the scaled media object if it doesn't exist. These extra permissions are added as a policy (`S3CrudPolicy`) to the ObjectLambdaFunction in the SAM template. diff --git a/readme.md b/readme.md index 38db63f..d859ba0 100644 --- a/readme.md +++ b/readme.md @@ -55,12 +55,6 @@ wp access network-update-dynamodb The parameters of the BU production deployment are in the `samconfig.toml` file under the "prod" stanza. -## S3 Object Lambda Pre-signed keys - -In typical usage, S3 Object Lambdas do not need direct read or write access to the S3 bucket. This is because the request event that the Lambda function receives contains a pre-signed that allows one-time read access directly without the need for additional credentials. - -In our case with image resizing involved, the original request may be rewritted for a different location (sized media are stored in a different location than original media for example). Also the scaled media object may not yet exist. For these reasons, we side-step the pre-signed key and use the AWS SDK to get the object directly from S3, at the potentially rewritten location. The Lambda is also granted write access to the bucket, so that it can save the scaled media object if it doesn't exist. These extra permissions are added as a policy (`S3CrudPolicy`) to the ObjectLambdaFunction in the SAM template. - ## Testing The package includes a suite of unit tests that can be run using the following command: From abd5a89686dd2341b6c9e5c1e72a39c70d786f4e Mon Sep 17 00:00:00 2001 From: Jonathan Williams Date: Wed, 17 Jan 2024 18:46:35 -0500 Subject: [PATCH 3/8] :pencil: patch docs --- docs/image-resizing.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/image-resizing.md b/docs/image-resizing.md index 89600cf..935f85b 100644 --- a/docs/image-resizing.md +++ b/docs/image-resizing.md @@ -4,7 +4,7 @@ Where WordPress normally generates all scaled derivates during file upload, this It also allows for original media to be stored separately from the scaled derivates, making it easier to manage very large media libraries. For example, when cloning sites for development or testing, the original media can be copied to the new site without having to copy all of the scaled versions. The scaled versions will be automatically generated when the media is requested. -Custom crop controls are available with the image scaling, either through GET parameters to the image request or through custom image sizes defined in a WordPress theme. More detail is available in the [Custom Crop](./docs/custom-crop.md) documentation. +Custom crop controls are available with the image scaling, either through GET parameters to the image request or through custom image sizes defined in a WordPress theme. The access controls are applied based on the path of the file, not the file name, so access controls are applied consistently across the original and any scaled versions of the file. From 6318cf1ea8013ecad68309a4e28a7430b5b8082a Mon Sep 17 00:00:00 2001 From: Jonathan Williams Date: Wed, 17 Jan 2024 19:02:58 -0500 Subject: [PATCH 4/8] :pencil: doc fixes --- docs/image-resizing.md | 10 ++++++---- docs/protected-media.md | 6 ++++-- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/docs/image-resizing.md b/docs/image-resizing.md index 935f85b..441f216 100644 --- a/docs/image-resizing.md +++ b/docs/image-resizing.md @@ -4,14 +4,16 @@ Where WordPress normally generates all scaled derivates during file upload, this It also allows for original media to be stored separately from the scaled derivates, making it easier to manage very large media libraries. For example, when cloning sites for development or testing, the original media can be copied to the new site without having to copy all of the scaled versions. The scaled versions will be automatically generated when the media is requested. -Custom crop controls are available with the image scaling, either through GET parameters to the image request or through custom image sizes defined in a WordPress theme. - The access controls are applied based on the path of the file, not the file name, so access controls are applied consistently across the original and any scaled versions of the file. The logic of the image scaling handler and how it relates to access control is described in the following diagram: ![Image scaling flow diagram](./images/image-scaling-flow-diagram.png) -## WordPress compatible custom image sizes +## WordPress compatible custom image crop controls + +Custom crop controls are available with the image scaling, either through GET parameters to the image request or through custom image sizes defined in a WordPress theme. + +### WordPress image sizes WordPress themes can define custom image sizes using the `add_image_size()` function. This function takes a `crop` parameter that determines if portions of the image should be removed to fit the custom size. The BU Media S3 WordPress plugin has a wp-cli command that can be used to push the custom image sizes defined in the theme to the DynamoDB table. These records use a primary key based on the site url and look like this: `SIZES#example.bu.edu/example-site`. @@ -19,7 +21,7 @@ The `getOrCreateObject()` function uses the `lookupCustomCrop()` function to loa By adding the crop parameter to the name of the object in S3, crop factors can change without causing a file name conflict. -## Custom Crop Parameters +### Custom Crop Parameters In addition to crop parameters defined in WordPress themes, custom crop parameters can be added as GET parameters to the URL. For example, the following URL will crop the left part of an image: diff --git a/docs/protected-media.md b/docs/protected-media.md index 57f439d..282b338 100644 --- a/docs/protected-media.md +++ b/docs/protected-media.md @@ -1,6 +1,6 @@ # Protected media -The Lambda applies access restrictions based on rules determined by records in DynamoDB and by the url of the request. These urls and DynamDB records are managed by the BU Access Control WordPress plugin. +The Lambda function applies access restrictions based on rules determined by records in DynamoDB and by the url of the request. These urls and DynamoDB records are managed by the BU Access Control WordPress plugin. There are two ways to protect media files in this application: individual file protections and whole site protections. @@ -33,6 +33,8 @@ This is an example of a `PROTECTED_SITES` record: To efficiently apply the access controls for these protected sites, the `PROTCETED_SITES` record is cached by the Lambda function for up to a minute. This means that any changes to the `PROTECTED_SITES` record will not be applied until the cache expires. The Lambda uses a value declared outside of the handler function to store the cache, and the cache is refreshed when the value is empty or expired. This is a standard part of the Lambda execution environment, there is a [good summary blog post about it here](https://katiyarvipinknp.medium.com/how-to-cache-the-data-in-aws-lambda-function-using-node-js-use-tmp-storage-of-aws-lambda-2c7e1e01d923). +On each request, the Lambda function checks if the site url is in the `PROTECTED_SITES` list. If so, it gets the access group name from the list and uses it to apply the access rules the same as with individual file protections. + ## Access control rules The access control rules are stored in a DynamoDB table, which is created by the CloudFormation template and populated by the BU Access Control WordPress plugin. The access rule records in the table have a composite primary key of `site` and `group`, where the `site` attribute is the url of the site and the `group` attribute is the name of the access group. The two parts of the primary key are combined with a `#` character as a delimiter. For example, the access rule record for the `example-group` access group on the `https://sites.bu.edu/example-site` site would have a primary key of `sites.bu.edu/example-site#example-group`. @@ -46,7 +48,7 @@ Each record has an attribute called `rules` which is a JSON encoded array of acc "entitlements":["http:\/\/iam.bu.edu\/hr\/OrgUnitParent\/9999999"], "ranges":[], "satisfy_all":null, - "admins":["site-","wrh"] + "admins":["site-admin1","site-admin2"], } ``` From 85b7d547eed6c8122fe52bf53147b463e395be9f Mon Sep 17 00:00:00 2001 From: Jonathan Williams Date: Wed, 17 Jan 2024 19:06:25 -0500 Subject: [PATCH 5/8] add example network ranges --- docs/protected-media.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/protected-media.md b/docs/protected-media.md index 282b338..483b7e9 100644 --- a/docs/protected-media.md +++ b/docs/protected-media.md @@ -46,7 +46,7 @@ Each record has an attribute called `rules` which is a JSON encoded array of acc "users":["webteam","authorized-user"], "states":["faculty"], "entitlements":["http:\/\/iam.bu.edu\/hr\/OrgUnitParent\/9999999"], - "ranges":[], + "ranges":["crc","bmc"], "satisfy_all":null, "admins":["site-admin1","site-admin2"], } From f20717a8d1865b0a6f13367bfd0497ce7d1dbd06 Mon Sep 17 00:00:00 2001 From: Jonathan Williams Date: Wed, 17 Jan 2024 19:13:01 -0500 Subject: [PATCH 6/8] add note --- docs/image-resizing.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/image-resizing.md b/docs/image-resizing.md index 441f216..cdc3dec 100644 --- a/docs/image-resizing.md +++ b/docs/image-resizing.md @@ -29,7 +29,7 @@ In addition to crop parameters defined in WordPress themes, custom crop paramete https://example.bu.edu/example-site/files/2024/01/16/picture-800x300.jpg?resize-position=top ``` -Currently only top, bottom, left, right are accepted as resize-position options +Currently only top, bottom, left, right are accepted as resize-position options, but in theory any of the [sharp library resize position options](https://sharp.pixelplumbing.com/api-resize) could be added. ## References From d3bd0371ea08bd5cd056668c008a3f2ba477b6f6 Mon Sep 17 00:00:00 2001 From: Jonathan Williams Date: Thu, 18 Jan 2024 14:55:25 -0500 Subject: [PATCH 7/8] main paragraph detail --- readme.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/readme.md b/readme.md index d859ba0..90a0942 100644 --- a/readme.md +++ b/readme.md @@ -1,6 +1,8 @@ # BU Protected S3 Object Lambda -This AWS Lambda application is designed to dynamically serve public and protected media files from an S3 bucket. It uses an S3 Object Lambda Access Point to apply access control protections and deliver objects from the bucket based on user session data and network location. It also provides WordPress compatible image resizing on demand using the [sharp](https://www.npmjs.com/package/sharp) library. +This AWS Lambda application, developed using the [Serverless Application Model (SAM)](https://aws.amazon.com/serverless/sam/), is designed to dynamically serve public and protected media files from an S3 bucket. It uses an S3 Object Lambda Access Point to apply access control protections and deliver objects from the bucket based on user session data and network location. It also provides WordPress compatible image resizing on demand using the [sharp](https://www.npmjs.com/package/sharp) library. + +At Boston University, it is integrated with WordPress to provide media library services for the [BU WordPress Service](https://www.bu.edu/tech/services/cccs/websites/www/wordpress/). ## Protected media From 1fd6d68b1af6424782cfc8f6a0c1b803c2ce1397 Mon Sep 17 00:00:00 2001 From: Jonathan Williams Date: Fri, 19 Jan 2024 10:56:20 -0500 Subject: [PATCH 8/8] :pencil: update ci/cd docs --- docs/cicd.md | 18 +++++++++--------- readme.md | 2 ++ 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/docs/cicd.md b/docs/cicd.md index 759dc3c..1acb2ee 100644 --- a/docs/cicd.md +++ b/docs/cicd.md @@ -3,9 +3,9 @@ Since [Github Actions](https://docs.github.com/actions) runs our CI/CD pipeline, a recommended refresher on CI/CD is the github ["CI/CD explained" article](https://resources.github.com/ci-cd/). The implementation of this pipeline is a one-time exercise, with this as a record detailing what was done. -### Overview +## Overview -A rudimentary [workflow](https://docs.github.com/en/actions/using-workflows/about-workflows#about-workflows) has been setup for deployment of the app that breaks down into the following sequence: +A [workflow](https://docs.github.com/en/actions/using-workflows/about-workflows#about-workflows) has been setup for deployment of the app that breaks down into the following sequence: 1. A feature branch is approved and merged into the main branch of the github repository for the app. This kicks off the [workflow](https://docs.github.com/en/actions/using-workflows/about-workflows#about-workflows). @@ -31,7 +31,7 @@ The abridged steps are: The role "WordpressProtectedAssetsGithubActionsCloudformingRole" can be found [here](https://us-east-1.console.aws.amazon.com/iamv2/home?region=us-east-1#/roles/details/WordpressProtectedAssetsGithubActionsCloudformingRole?section=permissions) Role policy: - ``` + ```json { "Version": "2012-10-17", "Statement": [ @@ -60,7 +60,7 @@ The abridged steps are: Trust relationship: - ``` + ```json { "Version": "2012-10-17", "Statement": [ @@ -87,7 +87,7 @@ The abridged steps are: 3. Create the github action (located in `.github/workflows/cicd.yml`) Below are relevant excerpts that shows the deploy job step that uses the role (`role-session-name`) - ``` + ```yaml env: AWS_REGION: us-east-1 @@ -98,9 +98,9 @@ The abridged steps are: ... jobs: - ... - deploy: - ... + ... + deploy: + ... - uses: aws-actions/configure-aws-credentials@v2 with: role-to-assume: arn:aws:iam::115619461932:role/WordpressProtectedAssetsGithubActionsCloudformingRole @@ -121,4 +121,4 @@ OIDC (OpenID Connect) is an identity layer built on top of OAuth 2.0 that allows 4. **Defense Against Key Exfiltration:** If an attacker gains access to the OIDC provider's private key used for token signing, they might try to insert their own public key into the provider's configuration. The OIDC thumbprint can help prevent such attacks by verifying that the public key used for token validation aligns with the trusted key. 5. **Third-Party OIDC Providers:** In scenarios where the relying party trusts multiple OIDC providers, the thumbprint can help ensure that tokens are only accepted from the intended and validated OIDC provider, preventing tokens from unauthorized providers. -In summary, the OIDC thumbprint is a security mechanism that enhances the trustworthiness of the OIDC authentication process by providing a means to verify the authenticity of the OIDC provider's token validation endpoint. It adds an additional layer of protection against various attack vectors, particularly those involving tampering, impersonation, and unauthorized token sources. \ No newline at end of file +In summary, the OIDC thumbprint is a security mechanism that enhances the trustworthiness of the OIDC authentication process by providing a means to verify the authenticity of the OIDC provider's token validation endpoint. It adds an additional layer of protection against various attack vectors, particularly those involving tampering, impersonation, and unauthorized token sources. diff --git a/readme.md b/readme.md index 90a0942..3d44483 100644 --- a/readme.md +++ b/readme.md @@ -57,6 +57,8 @@ wp access network-update-dynamodb The parameters of the BU production deployment are in the `samconfig.toml` file under the "prod" stanza. +Deployments are handled automatically by a Github Action that runs a `sam build` and `sam deploy` with the `prod` configuration when a commit is made to the `main` branch. More details about the Github Action are available in the [Continuous integration/deployment (CI/CD)](./docs/cicd.md) documentation. + ## Testing The package includes a suite of unit tests that can be run using the following command: