Skip to content

Commit c036f8d

Browse files
authored
Merge pull request #204 from NetApp/add_ingest_nas_audit
Add ingest NAS audit
2 parents 54bda2d + 854f2fb commit c036f8d

File tree

3 files changed

+510
-0
lines changed

3 files changed

+510
-0
lines changed

.github/CODEOWNERS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
/Monitoring/LUN-monitoring/ @LirazRom10
1818
/Monitoring/auto-add-cw-alarms/ @kcantrel
1919
/Monitoring/monitor-ontap-services/ @kcantrel
20+
/Monitoring/ingest_nas_audit_logs_into_cloudwatch/ @kcantrel
2021
/Terraform/deploy-fsx-ontap-sqlserver/ @varunrai
2122
/Terraform/deploy-fsx-ontap-fileshare-access/ @varunrai
2223
/Terraform/deploy-fsx-ontap/ @kcantrel
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
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>&#42;</td></tr>
45+
<tr><td rowspan="3">ec2</td><td>DescribeNetworkInterfaces</td><td>&#42;</td></tr>
46+
<tr><td>CreateNetworkInterface</td><td rowspan="2">arn:aws:ec2:&lt;region&gt;:&lt;accountID&gt;:&#42;</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:&lt;region&gt;:&lt;accountID&gt;:log-group:&#42;</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:&lt;region&gt;:&lt;accountID&gt;:&#42;</td></tr>
52+
<tr><td>GetObject</td><td rowspan="2">arn:aws:s3:&lt;region>:&lt;accountID&gt;:&#42;/&#42;</td></tr>
53+
<tr><td>PutObject</td></tr>
54+
<tr><td>Secrets Manager</td><td> GetSecretValue </td><td>arn:aws:secretsmanager:&lt;region&gt;:&lt;accountID&gt;:secret:&lt;secretName&gt&#42;</td></tr>
55+
</table>
56+
Where:
57+
58+
- &lt;accountID&gt; - is your AWS account ID.
59+
- &lt;region&gt; - is the region where the FSx for ONTAP file systems are located.
60+
- &lt;secretName&gt; - 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

Comments
 (0)