tfsec uses static analysis of your terraform templates to spot potential security issues. Now with terraform CDK support.
Install with brew/linuxbrew
brew install tfsec
Install with Chocolatey
choco install tfsec
Install with Scoop
scoop install tfsec
You can also grab the binary for your system from the releases page.
Alternatively, install with Go:
go install github.com/aquasecurity/tfsec/cmd/tfsec@latest
Please note that using go install
will install directly from the master
branch and version numbers will not be reported via tfsec --version
.
The binaries on the releases page are signed with the tfsec signing key D66B222A3EA4C25D5D1A097FC34ACEFB46EC39CE
Form more information check the signing page for instructions on verification.
tfsec will scan the specified directory. If no directory is specified, the current working directory will be used.
The exit status will be non-zero if tfsec finds problems, otherwise the exit status will be zero.
tfsec .
As an alternative to installing and running tfsec on your system, you may run tfsec in a Docker container.
There are a number of Docker options available
Image Name | Base | Comment |
---|---|---|
aquasec/tfsec | alpine | Normal tfsec image |
aquasec/tfsec-alpine | alpine | Exactly the same as aquasec/tfsec, but for those whole like to be explicit |
aquasec/tfsec-ci | alpine | tfsec with no entrypoint - useful for CI builds where you want to override the command |
aquasec/tfsec-scratch | scratch | An image built on scratch - nothing frilly, just runs tfsec |
To run:
docker run --rm -it -v "$(pwd):/src" aquasec/tfsec /src
A Visual Studio Code extension is being developed to integrate with tfsec results. More information can be found on the tfsec Marketplace page
If you want to run tfsec on your repository as a GitHub Action, you can use https://github.com/aquasecurity/tfsec-pr-commenter-action.
- Checks for sensitive data inclusion across all providers
- Checks for violations of best practice recommendations across all major cloud providers
- Scans modules (currently only local modules are supported)
- Evaluates expressions as well as literal values
- Evaluates Terraform functions e.g.
concat()
You may wish to ignore some warnings. If you'd like to do so, you can
simply add a comment containing tfsec:ignore:<rule>
to the offending
line in your templates. If the problem refers to a block of code, such
as a multiline string, you can add the comment on the line above the
block, by itself.
For example, to ignore an open security group rule:
resource "aws_security_group_rule" "my-rule" {
type = "ingress"
cidr_blocks = ["0.0.0.0/0"] #tfsec:ignore:aws-vpc-no-public-ingress-sgr
}
...or...
resource "aws_security_group_rule" "my-rule" {
type = "ingress"
#tfsec:ignore:aws-vpc-no-public-ingress-sgr
cidr_blocks = ["0.0.0.0/0"]
}
If you're not sure which line to add the comment on, just check the tfsec output for the line number of the discovered problem.
You can ignore multiple rules by concatenating the rules on a single line:
#tfsec:ignore:aws-s3-enable-bucket-encryption tfsec:ignore:aws-s3-enable-bucket-logging
resource "aws_s3_bucket" "my-bucket" {
bucket = "foobar"
acl = "private"
}
You can set expiration date for ignore
with yyyy-mm-dd
format. This is a useful feature when you want to ensure ignored issue won't be forgotten and should be revisited in the future.
#tfsec:ignore:aws-s3-enable-bucket-encryption:exp:2022-01-02
Ignore like this will be active only till 2022-01-02
, after this date it will be deactivated.
As of v0.52.0
, we fixed an issue where ignores were being incorrectly applied to entire blocks. This has made it more important that ignore comments are added to the correct line(s) in your templates. If tfsec mentions a particular line number as containing an issue you want to ignore, you should add the comment on that same line, or by itself on the line above it (or above the entire block to ignore all issues of that type in the block). If tfsec mentions an entire block as being the issue, you should add a comment on the line above the first line of the block.
You may wish to exclude some checks from running. If you'd like to do so, you can
simply add new argument -e check1,check2,etc
to your cmd command
tfsec . -e general-secrets-sensitive-in-variable,google-compute-disk-encryption-customer-keys
You can include values from a tfvars file in the scan, using, for example: --tfvars-file terraform.tfvars
.
tfsec supports AWS/Azure/GCP, and a variety of other resources. There are also checks which are provider agnostic.
Checks |
---|
AWS Checks |
Azure Checks |
GCP Checks |
CloudStack Checks |
DigitalOcean Checks |
GitHub Checks |
Kubernetes Checks |
OpenStack Checks |
Oracle Checks |
General Checks |
tfsec is designed for running in a CI pipeline. You may wish to run tfsec as part of your build without coloured
output. You can do this using --no-colour
(or --no-color
for our American friends).
You can output tfsec results as JSON, CSV, Checkstyle, Sarif, JUnit or just plain old human readable format. Use the --format
flag
to specify your desired format.
If you want to integrate with Github Security alerts and include the output of your tfsec checks you can use the tfsec-sarif-action Github action to run the static analysis then upload the results to the security alerts tab.
The alerts generated for tfsec-example-project look like this.
When you click through the alerts for the branch, you get more information about the actual issue.
For more information about adding security alerts, check
If you need to support versions of terraform which use HCL v1
(terraform <0.12), you can use v0.1.3
of tfsec, though support is
very limited and has fewer checks.
We always welcome contributions; big or small, it can be documentation updates, adding new checks or something bigger. Please check the Contributing Guide for details on how to help out.
Made with contributors-img.
tfsec
is an Aqua Security open source project.
Learn about our open source work and portfolio here.
Join the community, and talk to us about any matter in GitHub Discussion or Slack.