Skip to content

Commit 8464fac

Browse files
Enable bandit (#12722)
* Add new step to run Bandit security scan tool
1 parent 102be79 commit 8464fac

File tree

9 files changed

+104
-25
lines changed

9 files changed

+104
-25
lines changed

eng/pipelines/templates/steps/analyze.yml

+7
Original file line numberDiff line numberDiff line change
@@ -103,3 +103,10 @@ steps:
103103
BuildTargetingString: ${{ parameters.BuildTargetingString }}
104104
TestMarkArgument: ${{ parameters.TestMarkArgument }}
105105
AdditionalTestArgs: ${{parameters.AdditionalTestArgs}}
106+
107+
- template: ../steps/run_bandit.yml
108+
parameters:
109+
ServiceDirectory: ${{ parameters.ServiceDirectory }}
110+
BuildTargetingString: ${{ parameters.BuildTargetingString }}
111+
TestMarkArgument: ${{ parameters.TestMarkArgument }}
112+
AdditionalTestArgs: ${{parameters.AdditionalTestArgs}}

eng/pipelines/templates/steps/run_apistub.yml

+1-12
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,6 @@ parameters:
55
AdditionalTestArgs: ''
66

77
steps:
8-
- task: UsePythonVersion@0
9-
displayName: 'Use Python 3.7'
10-
condition: and(succeededOrFailed(), ne(variables['Skip.ApiStubGen'],'true'))
11-
inputs:
12-
versionSpec: '3.7'
13-
14-
- script: |
15-
pip install -r eng/ci_tools.txt
16-
displayName: 'Prep Environment'
17-
condition: and(succeededOrFailed(), ne(variables['Skip.ApiStubGen'],'true'))
18-
198
- task: PythonScript@0
209
displayName: 'Run Api Stub Generation'
2110
condition: and(succeededOrFailed(), ne(variables['Skip.ApiStubGen'],'true'))
@@ -28,4 +17,4 @@ steps:
2817
--service="${{ parameters.ServiceDirectory }}"
2918
--toxenv="apistub"
3019
--disablecov
31-
--omit-management
20+
--filter-type="Omit_management"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
parameters:
2+
BuildTargetingString: 'azure-*'
3+
ServiceDirectory: ''
4+
TestMarkArgument: ''
5+
EnvVars: {}
6+
7+
steps:
8+
- task: PythonScript@0
9+
displayName: 'Run Bandit'
10+
inputs:
11+
scriptPath: 'scripts/devops_tasks/setup_execute_tests.py'
12+
arguments: >-
13+
"${{ parameters.BuildTargetingString }}"
14+
--mark_arg="${{ parameters.TestMarkArgument }}"
15+
--service="${{ parameters.ServiceDirectory }}"
16+
--toxenv="bandit"
17+
--disablecov
18+
--filter-type="Bandit"
19+
env: ${{ parameters.EnvVars }}
20+
condition: and(succeededOrFailed(), ne(variables['Skip.Bandit'],'true'))

eng/pipelines/templates/steps/run_pylint.yml

+2-3
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,7 @@ steps:
99
displayName: 'Use Python 3.7'
1010
inputs:
1111
versionSpec: '3.7'
12-
condition: and(succeededOrFailed(), ne(variables['Skip.Pylint'],'true'))
13-
12+
condition: and(succeededOrFailed(), ne(variables['Skip.Pylint'],'true'))
1413

1514
- script: |
1615
pip install -r eng/ci_tools.txt
@@ -27,6 +26,6 @@ steps:
2726
--service="${{ parameters.ServiceDirectory }}"
2827
--toxenv="lint"
2928
--disablecov
30-
--omit-management
29+
--filter-type="Omit_management"
3130
env: ${{ parameters.EnvVars }}
3231
condition: and(succeededOrFailed(), ne(variables['Skip.Pylint'],'true'))

eng/test_tools.txt

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ pytest-custom-exit-code==0.3.0
77
pytest-xdist==1.32.0
88
# we pin coverage to 4.5.4 because there is an bug with `pytest-cov`. the generated coverage files cannot be `coverage combine`ed
99
coverage==4.5.4
10+
bandit==1.6.2
1011

1112
# locking packages defined as deps from azure-sdk-tools or azure-devtools
1213
pytoml==0.1.21

eng/tox/run_bandit.py

+47
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
#!/usr/bin/env python
2+
3+
# --------------------------------------------------------------------------------------------
4+
# Copyright (c) Microsoft Corporation. All rights reserved.
5+
# Licensed under the MIT License. See License.txt in the project root for license information.
6+
# --------------------------------------------------------------------------------------------
7+
8+
# This script is used to execute bandit within a tox environment. Depending on which package is being executed against,
9+
# a failure may be suppressed.
10+
11+
from subprocess import check_call, CalledProcessError
12+
import argparse
13+
import os
14+
import logging
15+
import sys
16+
17+
18+
logging.getLogger().setLevel(logging.INFO)
19+
20+
if __name__ == "__main__":
21+
parser = argparse.ArgumentParser(description="Run bandit against target folder.")
22+
23+
parser.add_argument(
24+
"-t",
25+
"--target",
26+
dest="target_package",
27+
help="The target package directory on disk. The target module passed to bandit will be <target_package>/azure.",
28+
required=True,
29+
)
30+
31+
args = parser.parse_args()
32+
33+
package_name = os.path.basename(os.path.abspath(args.target_package))
34+
try:
35+
check_call(
36+
[
37+
sys.executable,
38+
"-m",
39+
"bandit",
40+
"-r",
41+
os.path.join(args.target_package, "azure"),
42+
"-ll",
43+
]
44+
)
45+
except CalledProcessError as e:
46+
logging.error("{} exited with error {}".format(package_name, e.returncode))
47+
exit(1)

eng/tox/tox.ini

+13-1
Original file line numberDiff line numberDiff line change
@@ -235,4 +235,16 @@ commands =
235235
# install API stub generator
236236
{envbindir}/python -m pip install "git+https://github.com/azure/azure-sdk-tools.git#subdirectory=packages/python-packages/api-stub-generator&egg=api-stub-generator"
237237
{envbindir}/python -m pip freeze
238-
{envbindir}/python {toxinidir}/../../../eng/tox/run_apistubgen.py -t {toxinidir} -w {envtmpdir}
238+
{envbindir}/python {toxinidir}/../../../eng/tox/run_apistubgen.py -t {toxinidir} -w {envtmpdir}
239+
240+
241+
[testenv:bandit]
242+
skipsdist = false
243+
skip_install = false
244+
usedevelop = false
245+
changedir = {envtmpdir}
246+
deps =
247+
{[base]deps}
248+
commands =
249+
{envbindir}/python -m pip freeze
250+
{envbindir}/python {toxinidir}/../../../eng/tox/run_bandit.py -t {toxinidir}

scripts/devops_tasks/common_tasks.py

+6
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,10 @@
5959
"azure-mgmt-core",
6060
]
6161

62+
BANDIT_EXCLUDED_PACKAGES = [
63+
"azure-servicebus",
64+
]
65+
6266
omit_regression = (
6367
lambda x: "nspkg" not in x
6468
and "mgmt" not in x
@@ -70,13 +74,15 @@
7074
omit_build = lambda x: x # Dummy lambda to match omit type
7175
lambda_filter_azure_pkg = lambda x: x.startswith("azure") and "-nspkg" not in x
7276
omit_mgmt = lambda x: "mgmt" not in x or os.path.basename(x) in MANAGEMENT_PACKAGES_FILTER_EXCLUSIONS
77+
omit_bandit = lambda x: not(os.path.basename(x) in BANDIT_EXCLUDED_PACKAGES or "mgmt" in x)
7378

7479
# dict of filter type and filter function
7580
omit_funct_dict = {
7681
"Build": omit_build,
7782
"Docs": omit_docs,
7883
"Regression": omit_regression,
7984
"Omit_management": omit_mgmt,
85+
"Bandit": omit_bandit,
8086
}
8187

8288
def log_file(file_location, is_error=False):

scripts/devops_tasks/setup_execute_tests.py

+7-9
Original file line numberDiff line numberDiff line change
@@ -276,13 +276,14 @@ def execute_global_install_and_test(
276276
)
277277

278278
parser.add_argument(
279-
"--omit-management",
280-
dest="omit_management",
281-
default=False,
282-
action="store_true",
283-
help="Flag that indicates to omit any management packages except any management packages that should not be filtered. for e.g azure-mgmt-core",
279+
"--filter-type",
280+
dest="filter_type",
281+
default='Build',
282+
help="Filter type to identify eligible packages. for e.g. packages filtered in Build can pass filter type as Build,",
283+
choices=['Build', "Docs", "Regression", "Omit_management", "Bandit"]
284284
)
285285

286+
286287
args = parser.parse_args()
287288

288289
# We need to support both CI builds of everything and individual service
@@ -293,10 +294,7 @@ def execute_global_install_and_test(
293294
else:
294295
target_dir = root_dir
295296

296-
if args.omit_management:
297-
targeted_packages = process_glob_string(args.glob_string, target_dir, "", "Omit_management")
298-
else:
299-
targeted_packages = process_glob_string(args.glob_string, target_dir)
297+
targeted_packages = process_glob_string(args.glob_string, target_dir, "", args.filter_type)
300298
extended_pytest_args = []
301299

302300
if len(targeted_packages) == 0:

0 commit comments

Comments
 (0)