|
| 1 | +# Ingest FSx for ONTAP NAS audit logs into CloudWatch |
| 2 | + |
| 3 | +## Overview |
| 4 | +This sample demonstrates a way to ingest the NAS audit logs from an FSx for Data ONTAP file system into a CloudWatch log group |
| 5 | +without having to NFS or CIFS mount a volume to access them. |
| 6 | +It will attempt to gather the audit logs from all the FSx for Data ONTAP file systems that are within a specified region. |
| 7 | +It will skip any file systems where the credentials aren't provided in the supplied AWS SecretManager's secret, or that do not have |
| 8 | +the appropriate NAS auditing configuration enabled. |
| 9 | +It will maintain a "stats" file in an S3 bucket that will keep track of the last time it successfully ingested audit logs from each |
| 10 | +file system to try to ensure it doesn't process an audit file more than once. |
| 11 | +You can run this script as a standalone program or as a Lambda function. These directions assume you are going to run it as a Lambda function. |
| 12 | + |
| 13 | +## Prerequisites |
| 14 | +- An FSx for Data ONTAP file system. |
| 15 | +- An S3 bucket to store the "stats" file. The "stats" file is used to keep track of the last time the Lambda function successfully |
| 16 | +ingested audit logs from each file system. Its size will be small (i.e. less than a few megabytes). |
| 17 | +- Have NAS auditing configured and enabled on the FSx for Data ONTAP file system. **Ensure you have selected the XML format for the audit logs.** Also, |
| 18 | +ensure you have set up a rotation schedule. The program will only act on audit log files that have been finalized, and not the "active" one. You can read this |
| 19 | +[knowledge based article](https://kb.netapp.com/on-prem/ontap/da/NAS/NAS-KBs/How_to_set_up_NAS_auditing_in_ONTAP_9) for instructions on how to setup NAS auditing. |
| 20 | +- Have the NAS auditing configured to store the audit logs in a volume with the same name on all FSx for Data ONTAP file |
| 21 | +systems that you want to ingest the audit logs from. |
| 22 | +- A CloudWatch log group. |
| 23 | +- An AWS Secrets Manager secret that contains the passwords for the fsxadmin account for all the FSx for Data ONTAP file systems you want to gather audit logs from. |
| 24 | + - The secret should be in the form of key/value pairs (or a JSON object) where the key is the file system ID and value is the password for the fsxadmin account. For example: |
| 25 | +```json |
| 26 | + { |
| 27 | + "fs-1234567890abcdef0": "password1", |
| 28 | + "fs-abcdef012345" : "password2" |
| 29 | + } |
| 30 | +``` |
| 31 | +- You have applied the necessary SACLs to the files you want to audit. The knowledge base article linked above provides guidance on how to do this. |
| 32 | +- Since the Lambda function runs within your VPC it will not have access to the Internet, even if you can access the Internet from the Subnet it run from. |
| 33 | +Therefore, there needs to be an VPC endpoint for all the AWS services that the Lambda function uses. Specifically, the Lambda function needs to be able to access the following services: |
| 34 | + - FSx. |
| 35 | + - Secrets Manager. |
| 36 | + - CloudWatch Logs. |
| 37 | + - S3 - Note that typically there is a Gateway type VPC endpoint for S3, so you should not need to create a VPC endpoint for S3. |
| 38 | + - EC2. |
| 39 | +- You have created a role with the necessary permissions to allow the Lambda function to do the following: |
| 40 | + |
| 41 | +<!--- Using HTML to create a table that has rowspan attributes since the markdown table syntax does not support that. ---> |
| 42 | +<table> |
| 43 | +<tr><th>Service</td><th>Actions</td><th>Resources</th></tr> |
| 44 | +<tr><td>Fsx</td><td>fsx:DescribeFileSystems</td><td>*</td></tr> |
| 45 | +<tr><td rowspan="3">ec2</td><td>DescribeNetworkInterfaces</td><td>*</td></tr> |
| 46 | +<tr><td>CreateNetworkInterface</td><td rowspan="2">arn:aws:ec2:<region>:<accountID>:*</td></tr> |
| 47 | +<tr><td>DeleteNetworkInterface</td></tr> |
| 48 | +<tr><td rowspan="3">CloudWatch Logs</td><td>CreateLogGroup</td><td rowspan="3">arn:aws:logs:<region>:<accountID>:log-group:*</td></tr> |
| 49 | +<tr><td>CreateLogStream</td></tr> |
| 50 | +<tr><td>PutLogEvents</td></tr> |
| 51 | +<tr><td rowspan="3">s3</td><td> ListBucket</td><td> arn:aws:s3:<region>:<accountID>:*</td></tr> |
| 52 | +<tr><td>GetObject</td><td rowspan="2">arn:aws:s3:<region>:<accountID>:*/*</td></tr> |
| 53 | +<tr><td>PutObject</td></tr> |
| 54 | +<tr><td>Secrets Manager</td><td> GetSecretValue </td><td>arn:aws:secretsmanager:<region>:<accountID>:secret:<secretName>*</td></tr> |
| 55 | +</table> |
| 56 | +Where: |
| 57 | + |
| 58 | +- <accountID> - is your AWS account ID. |
| 59 | +- <region> - is the region where the FSx for ONTAP file systems are located. |
| 60 | +- <secretName> - is the name of the secret that contains the credentials for the fsxadmin accounts. |
| 61 | + |
| 62 | +Notes: |
| 63 | +- Since the Lambda function runs within your VPC it needs to be able to create and delete network interfaces. |
| 64 | +- The AWS Security Group Policy builder incorrectly generates resource lines for the `CreateNetworkInterface` |
| 65 | +and `DeleteNetworkInterface` actions. The correct resource line is `arn:aws:ec2:<region>:<accountID>:*`. |
| 66 | +- It needs to be able to create a log groups so it can create a log group for the diagnostic output from the Lambda function. |
| 67 | +- Since the ARN of any Secrets Manager secret has random characters at the end of it, you must add the `*` at the end, or provide the full ARN of the secret. |
| 68 | + |
| 69 | +## Deployment |
| 70 | +1. Create a Lambda deployment package by: |
| 71 | + 1. Downloading the `ingest_fsx_audit_logs.py` file from this repository and placing it in an empty directory. |
| 72 | + 1. Rename the file to `lambda_function.py`. |
| 73 | + 1. Install a couple dependencies that aren't included with AWS's base Lambda deployment by running the following command:<br> |
| 74 | +`pip install --target . xmltodict requests_toolbelt`<br> |
| 75 | + 1. Zip the contents of the directory into a zip file.<br> |
| 76 | +`zip -r ingest_fsx_audit_logs.zip .`<br> |
| 77 | + |
| 78 | +2. Within the AWS console, or using the AWS API, create a Lambda function with: |
| 79 | + 1. Python 3.10, or higher, as the runtime. |
| 80 | + 1. Set the permissions to the role created above. |
| 81 | + 1. Under `Additional Configurations` select `Enable VPC` and select a VPC and Subnet that will have access to all the FSx for ONTAP |
| 82 | +file system management endpoints that you want to gather audit logs from. Also, select a Security Group that allows TCP port 443 outbound. |
| 83 | +Inbound rules don't matter since the Lambda function is not accessible from a network. |
| 84 | + 1. Click `Create Function` and on the next page, under the `Code` tab, select `Upload From -> .zip file.` Provide the .zip file created by the steps above. |
| 85 | + 1. From the `Configuration -> General` tab set the timeout to at least 30 seconds. You will may need to increase that if it has to process a lot of audit entries and/or process a lot of FSx for ONTAP file systems. |
| 86 | + |
| 87 | +3. Configure the Lambda function by setting the following environment variables. For a Lambda function you do this by clicking on the `Configuration` tab and then the `Environment variables` sub tab. |
| 88 | + |
| 89 | +| Variable | Description | |
| 90 | +| --- | --- | |
| 91 | +| fsxRegion | The region where the FSx for ONTAP file systems are located. | |
| 92 | +| secretArn | The ARN of the secret that contains the credentials for all the FSx for ONTAP file systems you want to gather audit logs from. | |
| 93 | +| secretRegion | The region where the secret is stored. | |
| 94 | +| s3BucketRegion | The region of the S3 bucket where the stats file is stored. | |
| 95 | +| s3BucketName | The name of the S3 bucket where the stats file is stored. | |
| 96 | +| statsName | The name you want to use as the stats file. | |
| 97 | +| logGroupName | The name of the CloudWatch log group to ingest the audit logs into. | |
| 98 | +| volumeName | The name of the volume, on all the FSx for ONTAP file systems, where the audit logs are stored. | |
| 99 | +| vserverName | The name of the vserver, on all the FSx for ONTAP file systems, where the audit logs are stored. | |
| 100 | + |
| 101 | +4. Test the Lambda function by clicking on the `Test` tab and then clicking on the `Test` button. You should see "Executing function: succeeded". |
| 102 | +If not, click on the "Details" button to see what errors there are. |
| 103 | + |
| 104 | +5. After you have tested that the Ladmba function is running correctly, add an EventBridge trigger to have it run periodically. |
| 105 | +You can do this by clicking on the `Add Trigger` button within the AWS console and selecting `EventBridge (CloudWatch Events)` |
| 106 | +from the dropdown. You can then configure the schedule to run as often as you want. How often depends on how often you have |
| 107 | +set up your FSx for ONTAP file systems to generate audit logs, and how up-to-date you want the CloudWatch logs to be. |
| 108 | + |
| 109 | +## Author Information |
| 110 | + |
| 111 | +This repository is maintained by the contributors listed on [GitHub](https://github.com/NetApp/FSx-ONTAP-samples-scripts/graphs/contributors). |
| 112 | + |
| 113 | +## License |
| 114 | + |
| 115 | +Licensed under the Apache License, Version 2.0 (the "License"). |
| 116 | + |
| 117 | +You may obtain a copy of the License at [apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0). |
| 118 | + |
| 119 | +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an _"AS IS"_ basis, without WARRANTIES or conditions of any kind, either express or implied. |
| 120 | + |
| 121 | +See the License for the specific language governing permissions and limitations under the License. |
| 122 | + |
| 123 | +© 2024 NetApp, Inc. All Rights Reserved. |
0 commit comments