diff --git a/README.md b/README.md
index c992cd3..c3af97d 100644
--- a/README.md
+++ b/README.md
@@ -45,7 +45,6 @@ The available properties of an element can be listed by using `--describe` follo
(pytm) ➜ pytm git:(master) ✗ ./tm.py --describe Element
Element class attributes:
- OS
definesConnectionTimeout default: False
description
handlesResources default: False
@@ -53,10 +52,8 @@ Element class attributes:
implementsNonce default: False
inBoundary
inScope Is the element in scope of the threat model, default: True
- isAdmin default: False
isHardened default: False
name required
- onAWS default: False
```
@@ -83,14 +80,11 @@ user = Actor("User")
user.inBoundary = User_Web
web = Server("Web Server")
-web.OS = "CloudOS"
web.isHardened = True
db = Datastore("SQL Database (*)")
-db.OS = "CentOS"
db.isHardened = False
db.inBoundary = Web_DB
-db.isSql = True
db.inScope = False
my_lambda = Lambda("cleanDBevery6hours")
@@ -261,7 +255,7 @@ If `target` is a Dataflow, remember you can access `target.source` and/or `targe
Conditions on assets can analyze all incoming and outgoing Dataflows by inspecting
the `target.input` and `target.output` attributes. For example, to match a threat only against
servers with incoming traffic, use `any(target.inputs)`. A more advanced example,
-matching elements connecting to SQL datastores, would be `any(f.sink.oneOf(Datastore) and f.sink.isSQL for f in target.outputs)`.
+matching elements connecting to SQL datastores, would be `any(f.sink.oneOf(Datastore) for f in target.outputs) and target.protocol == 'SQL'`.
## Currently supported threats
diff --git a/docs/pytm/index.html b/docs/pytm/index.html
index a4e6d34..cf029a4 100644
--- a/docs/pytm/index.html
+++ b/docs/pytm/index.html
@@ -198,7 +198,6 @@
Class variables
doc="""Correctly checks the revocation status
of credentials used to authenticate the destination""",
)
- isAdmin = varBool(False)
# should not be settable, but accessible
providesIntegrity = False
@@ -284,22 +283,6 @@ Instance variables
return self.data.get(instance, self.default)
-var isAdmin
-
-
-
-
-Expand source code
-
-def __get__(self, instance, owner):
- # when x.d is called we get here
- # instance = x
- # owner = type(x)
- if instance is None:
- return self
- return self.data.get(instance, self.default)
-
-
var outputs
@@ -644,10 +627,8 @@ Instance variables
doc="""Correctly checks the revocation status
of credentials used to authenticate the destination""",
)
- authenticatedWith = varBool(False)
order = varInt(-1, doc="Number of this data flow in the threat model")
implementsAuthenticationScheme = varBool(False)
- implementsCommunicationProtocol = varBool(False)
note = varString("")
usesVPN = varBool(False)
authorizesSource = varBool(False)
@@ -708,22 +689,6 @@ Ancestors
Instance variables
-var authenticatedWith
--
-
-
-
-Expand source code
-
-def __get__(self, instance, owner):
- # when x.d is called we get here
- # instance = x
- # owner = type(x)
- if instance is None:
- return self
- return self.data.get(instance, self.default)
-
-
var authenticatesDestination
-
Verifies the identity of the destination,
@@ -822,22 +787,6 @@
Instance variables
return self.data.get(instance, self.default)
-
var implementsCommunicationProtocol
-
-
-
-
-
-Expand source code
-
-def __get__(self, instance, owner):
- # when x.d is called we get here
- # instance = x
- # owner = type(x)
- if instance is None:
- return self
- return self.data.get(instance, self.default)
-
-
var isEncrypted
-
@@ -1097,22 +1046,10 @@
Methods
class Datastore(Asset):
"""An entity storing data"""
- onRDS = varBool(False)
- storesLogData = varBool(False)
- storesPII = varBool(
- False,
- doc="""Personally Identifiable Information
-is any information relating to an identifiable person.""",
- )
- storesSensitiveData = varBool(False)
- isSQL = varBool(True)
- providesConfidentiality = varBool(False)
providesIntegrity = varBool(False)
isShared = varBool(False)
- hasWriteAccess = varBool(False)
handlesResourceConsumption = varBool(False)
isResilient = varBool(False)
- handlesInterruptions = varBool(False)
usesEncryptionAlgorithm = varString("")
implementsPOLP = varBool(
False,
@@ -1150,22 +1087,6 @@ Ancestors
Instance variables
-var handlesInterruptions
--
-
-
-
-Expand source code
-
-def __get__(self, instance, owner):
- # when x.d is called we get here
- # instance = x
- # owner = type(x)
- if instance is None:
- return self
- return self.data.get(instance, self.default)
-
-
var handlesResourceConsumption
-
@@ -1182,22 +1103,6 @@
Instance variables
return self.data.get(instance, self.default)
-
var hasWriteAccess
-
-
-
-
-
-Expand source code
-
-def __get__(self, instance, owner):
- # when x.d is called we get here
- # instance = x
- # owner = type(x)
- if instance is None:
- return self
- return self.data.get(instance, self.default)
-
-
var implementsPOLP
-
The principle of least privilege (PoLP),
@@ -1235,22 +1140,6 @@
Instance variables
return self.data.get(instance, self.default)
-
var isSQL
-
-
-
-
-
-Expand source code
-
-def __get__(self, instance, owner):
- # when x.d is called we get here
- # instance = x
- # owner = type(x)
- if instance is None:
- return self
- return self.data.get(instance, self.default)
-
-
var isShared
-
@@ -1267,38 +1156,6 @@
Instance variables
return self.data.get(instance, self.default)
-
var onRDS
-
-
-
-
-
-Expand source code
-
-def __get__(self, instance, owner):
- # when x.d is called we get here
- # instance = x
- # owner = type(x)
- if instance is None:
- return self
- return self.data.get(instance, self.default)
-
-
-
var providesConfidentiality
-
-
-
-
-
-Expand source code
-
-def __get__(self, instance, owner):
- # when x.d is called we get here
- # instance = x
- # owner = type(x)
- if instance is None:
- return self
- return self.data.get(instance, self.default)
-
-
var providesIntegrity
-
@@ -1315,55 +1172,6 @@
Instance variables
return self.data.get(instance, self.default)
-
var storesLogData
-
-
-
-
-
-Expand source code
-
-def __get__(self, instance, owner):
- # when x.d is called we get here
- # instance = x
- # owner = type(x)
- if instance is None:
- return self
- return self.data.get(instance, self.default)
-
-
-
var storesPII
-
-
-
Personally Identifiable Information
-is any information relating to an identifiable person.
-
-
-Expand source code
-
-def __get__(self, instance, owner):
- # when x.d is called we get here
- # instance = x
- # owner = type(x)
- if instance is None:
- return self
- return self.data.get(instance, self.default)
-
-
-
var storesSensitiveData
-
-
-
-
-
-Expand source code
-
-def __get__(self, instance, owner):
- # when x.d is called we get here
- # instance = x
- # owner = type(x)
- if instance is None:
- return self
- return self.data.get(instance, self.default)
-
-
var usesEncryptionAlgorithm
-
@@ -1819,7 +1627,6 @@
Instance variables
class Lambda(Asset):
"""A lambda function running in a Function-as-a-Service (FaaS) environment"""
- onAWS = varBool(True)
environment = varString("")
implementsAPI = varBool(False)
@@ -1894,22 +1701,6 @@ Instance variables
return self.data.get(instance, self.default)
-
var onAWS
-
-
-
-
-
-Expand source code
-
-def __get__(self, instance, owner):
- # when x.d is called we get here
- # instance = x
- # owner = type(x)
- if instance is None:
- return self
- return self.data.get(instance, self.default)
-
-
@@ -1925,16 +1716,10 @@ Instance variables
class Process(Asset):
"""An entity processing data"""
- codeType = varString("Unmanaged")
- implementsCommunicationProtocol = varBool(False)
- providesConfidentiality = varBool(False)
providesIntegrity = varBool(False)
isResilient = varBool(False)
- tracksExecutionFlow = varBool(False)
implementsCSRFToken = varBool(False)
handlesResourceConsumption = varBool(False)
- handlesCrashes = varBool(False)
- handlesInterruptions = varBool(False)
implementsAPI = varBool(False)
usesSecureFunctions = varBool(False)
environment = varString("")
@@ -1996,22 +1781,6 @@ Instance variables
return self.data.get(instance, self.default)
-var codeType
--
-
-
-
-Expand source code
-
-def __get__(self, instance, owner):
- # when x.d is called we get here
- # instance = x
- # owner = type(x)
- if instance is None:
- return self
- return self.data.get(instance, self.default)
-
-
var disablesiFrames
-
@@ -2076,38 +1845,6 @@
Instance variables
return self.data.get(instance, self.default)
-var handlesCrashes
--
-
-
-
-Expand source code
-
-def __get__(self, instance, owner):
- # when x.d is called we get here
- # instance = x
- # owner = type(x)
- if instance is None:
- return self
- return self.data.get(instance, self.default)
-
-
-
var handlesInterruptions
-
-
-
-
-
-Expand source code
-
-def __get__(self, instance, owner):
- # when x.d is called we get here
- # instance = x
- # owner = type(x)
- if instance is None:
- return self
- return self.data.get(instance, self.default)
-
-
var handlesResourceConsumption
-
@@ -2156,22 +1893,6 @@
Instance variables
return self.data.get(instance, self.default)
-
var implementsCommunicationProtocol
-
-
-
-
-
-Expand source code
-
-def __get__(self, instance, owner):
- # when x.d is called we get here
- # instance = x
- # owner = type(x)
- if instance is None:
- return self
- return self.data.get(instance, self.default)
-
-
var implementsPOLP
-
The principle of least privilege (PoLP),
@@ -2209,22 +1930,6 @@
Instance variables
return self.data.get(instance, self.default)
-
var providesConfidentiality
-
-
-
-
-
-Expand source code
-
-def __get__(self, instance, owner):
- # when x.d is called we get here
- # instance = x
- # owner = type(x)
- if instance is None:
- return self
- return self.data.get(instance, self.default)
-
-
var providesIntegrity
-
@@ -2241,22 +1946,6 @@
Instance variables
return self.data.get(instance, self.default)
-
var tracksExecutionFlow
-
-
-
-
-
-Expand source code
-
-def __get__(self, instance, owner):
- # when x.d is called we get here
- # instance = x
- # owner = type(x)
- if instance is None:
- return self
- return self.data.get(instance, self.default)
-
-
var usesMFA
-
Multi-factor authentication is an authentication method
@@ -2356,7 +2045,6 @@
Instance variables
class Server(Asset):
"""An entity processing data"""
- providesConfidentiality = varBool(False)
providesIntegrity = varBool(False)
validatesHeaders = varBool(False)
encodesHeaders = varBool(False)
@@ -2531,22 +2219,6 @@ Instance variables
return self.data.get(instance, self.default)
-
var providesConfidentiality
-
-
-
-
-
-Expand source code
-
-def __get__(self, instance, owner):
- # when x.d is called we get here
- # instance = x
- # owner = type(x)
- if instance is None:
- return self
- return self.data.get(instance, self.default)
-
-
var providesIntegrity
-
@@ -3655,7 +3327,6 @@
checksDestinationRevocation
data
inputs
-isAdmin
outputs
port
protocol
@@ -3692,7 +3363,6 @@
-
hasDataLeaks
implementsAuthenticationScheme
-implementsCommunicationProtocol
isEncrypted
isResponse
note
@@ -3720,19 +3389,11 @@
@@ -3764,29 +3425,22 @@
-
allowsClientSideScripting
-codeType
disablesiFrames
encryptsCookies
encryptsSessionData
environment
-handlesCrashes
-handlesInterruptions
handlesResourceConsumption
implementsAPI
implementsCSRFToken
-implementsCommunicationProtocol
implementsPOLP
isResilient
-providesConfidentiality
providesIntegrity
-tracksExecutionFlow
usesMFA
usesParameterizedInput
usesSecureFunctions
@@ -3805,7 +3459,6 @@
implementsStrictHTTPValidation
invokesScriptFilters
isResilient
-providesConfidentiality
providesIntegrity
usesCache
usesCodeSigning
diff --git a/pytm/pytm.py b/pytm/pytm.py
index caeebe6..12fcaf2 100644
--- a/pytm/pytm.py
+++ b/pytm/pytm.py
@@ -1041,7 +1041,6 @@ class Asset(Element):
data = varData([], doc="Default type of data in incoming data flows")
inputs = varElements([], doc="incoming Dataflows")
outputs = varElements([], doc="outgoing Dataflows")
- onAWS = varBool(False)
isHardened = varBool(False)
implementsAuthenticationScheme = varBool(False)
implementsNonce = varBool(
@@ -1073,16 +1072,13 @@ class Asset(Element):
checksInputBounds = varBool(False)
encodesOutput = varBool(False)
handlesResourceConsumption = varBool(False)
- authenticationScheme = varString("")
usesEnvironmentVariables = varBool(False)
- OS = varString("")
providesIntegrity = varBool(False)
class Lambda(Asset):
"""A lambda function running in a Function-as-a-Service (FaaS) environment"""
- onAWS = varBool(True)
environment = varString("")
implementsAPI = varBool(False)
@@ -1127,7 +1123,6 @@ def _shape(self):
class Server(Asset):
"""An entity processing data"""
- providesConfidentiality = varBool(False)
providesIntegrity = varBool(False)
validatesHeaders = varBool(False)
encodesHeaders = varBool(False)
@@ -1173,22 +1168,10 @@ def __init__(self, name, **kwargs):
class Datastore(Asset):
"""An entity storing data"""
- onRDS = varBool(False)
- storesLogData = varBool(False)
- storesPII = varBool(
- False,
- doc="""Personally Identifiable Information
-is any information relating to an identifiable person.""",
- )
- storesSensitiveData = varBool(False)
- isSQL = varBool(True)
- providesConfidentiality = varBool(False)
providesIntegrity = varBool(False)
isShared = varBool(False)
- hasWriteAccess = varBool(False)
handlesResourceConsumption = varBool(False)
isResilient = varBool(False)
- handlesInterruptions = varBool(False)
usesEncryptionAlgorithm = varString("")
implementsPOLP = varBool(
False,
@@ -1238,7 +1221,6 @@ class Actor(Element):
doc="""Correctly checks the revocation status
of credentials used to authenticate the destination""",
)
- isAdmin = varBool(False)
# should not be settable, but accessible
providesIntegrity = False
@@ -1249,16 +1231,10 @@ def __init__(self, name, **kwargs):
class Process(Asset):
"""An entity processing data"""
- codeType = varString("Unmanaged")
- implementsCommunicationProtocol = varBool(False)
- providesConfidentiality = varBool(False)
providesIntegrity = varBool(False)
isResilient = varBool(False)
- tracksExecutionFlow = varBool(False)
implementsCSRFToken = varBool(False)
handlesResourceConsumption = varBool(False)
- handlesCrashes = varBool(False)
- handlesInterruptions = varBool(False)
implementsAPI = varBool(False)
usesSecureFunctions = varBool(False)
environment = varString("")
@@ -1325,10 +1301,8 @@ class Dataflow(Element):
doc="""Correctly checks the revocation status
of credentials used to authenticate the destination""",
)
- authenticatedWith = varBool(False)
order = varInt(-1, doc="Number of this data flow in the threat model")
implementsAuthenticationScheme = varBool(False)
- implementsCommunicationProtocol = varBool(False)
note = varString("")
usesVPN = varBool(False)
authorizesSource = varBool(False)
diff --git a/tests/output.json b/tests/output.json
index 7037804..7d6e32b 100644
--- a/tests/output.json
+++ b/tests/output.json
@@ -51,7 +51,6 @@
"inputs": [
"Show comments (*)"
],
- "isAdmin": false,
"levels": [
0
],
@@ -65,11 +64,9 @@
"providesIntegrity": false
},
{
- "OS": "",
"__class__": "Server",
"authenticatesDestination": false,
"authenticatesSource": false,
- "authenticationScheme": "",
"authorizesSource": false,
"checksDestinationRevocation": false,
"checksInputBounds": false,
@@ -104,7 +101,6 @@
],
"maxClassification": "Classification.UNKNOWN",
"name": "Web Server",
- "onAWS": false,
"outputs": [
"Insert query with comments",
"Call func",
@@ -112,7 +108,6 @@
],
"port": -1,
"protocol": "",
- "providesConfidentiality": false,
"providesIntegrity": false,
"sanitizesInput": false,
"usesCache": false,
@@ -129,11 +124,9 @@
"validatesInput": false
},
{
- "OS": "",
"__class__": "Lambda",
"authenticatesDestination": false,
"authenticatesSource": false,
- "authenticationScheme": "",
"authorizesSource": false,
"checksDestinationRevocation": false,
"checksInputBounds": false,
@@ -161,7 +154,6 @@
],
"maxClassification": "Classification.UNKNOWN",
"name": "Lambda func",
- "onAWS": true,
"outputs": [],
"port": -1,
"protocol": "",
@@ -171,16 +163,13 @@
"validatesInput": false
},
{
- "OS": "",
"__class__": "Process",
"allowsClientSideScripting": false,
"authenticatesDestination": false,
"authenticatesSource": false,
- "authenticationScheme": "",
"authorizesSource": false,
"checksDestinationRevocation": false,
"checksInputBounds": false,
- "codeType": "Unmanaged",
"data": [],
"definesConnectionTimeout": false,
"description": "",
@@ -190,15 +179,12 @@
"encryptsSessionData": false,
"environment": "",
"findings": [],
- "handlesCrashes": false,
- "handlesInterruptions": false,
"handlesResourceConsumption": false,
"handlesResources": false,
"hasAccessControl": false,
"implementsAPI": false,
"implementsAuthenticationScheme": false,
"implementsCSRFToken": false,
- "implementsCommunicationProtocol": false,
"implementsNonce": false,
"implementsPOLP": false,
"inBoundary": null,
@@ -212,16 +198,13 @@
],
"maxClassification": "Classification.UNKNOWN",
"name": "Task queue worker",
- "onAWS": false,
"outputs": [
"Query for tasks"
],
"port": -1,
"protocol": "",
- "providesConfidentiality": false,
"providesIntegrity": false,
"sanitizesInput": false,
- "tracksExecutionFlow": false,
"usesEnvironmentVariables": false,
"usesMFA": false,
"usesParameterizedInput": false,
@@ -231,11 +214,9 @@
"verifySessionIdentifiers": false
},
{
- "OS": "",
"__class__": "Datastore",
"authenticatesDestination": false,
"authenticatesSource": false,
- "authenticationScheme": "",
"authorizesSource": false,
"checksDestinationRevocation": false,
"checksInputBounds": false,
@@ -244,11 +225,9 @@
"description": "",
"encodesOutput": false,
"findings": [],
- "handlesInterruptions": false,
"handlesResourceConsumption": false,
"handlesResources": false,
"hasAccessControl": false,
- "hasWriteAccess": false,
"implementsAuthenticationScheme": false,
"implementsNonce": false,
"implementsPOLP": false,
@@ -261,26 +240,19 @@
"isEncrypted": false,
"isHardened": false,
"isResilient": false,
- "isSQL": true,
"isShared": false,
"levels": [
0
],
"maxClassification": "Classification.UNKNOWN",
"name": "SQL Database",
- "onAWS": false,
- "onRDS": false,
"outputs": [
"Retrieve comments"
],
"port": -1,
"protocol": "",
- "providesConfidentiality": false,
"providesIntegrity": false,
"sanitizesInput": false,
- "storesLogData": false,
- "storesPII": false,
- "storesSensitiveData": false,
"usesEncryptionAlgorithm": "",
"usesEnvironmentVariables": false,
"validatesInput": false
@@ -289,7 +261,6 @@
"findings": [],
"flows": [
{
- "authenticatedWith": false,
"authenticatesDestination": false,
"authorizesSource": false,
"checksDestinationRevocation": false,
@@ -300,7 +271,6 @@
"dstPort": -1,
"findings": [],
"implementsAuthenticationScheme": false,
- "implementsCommunicationProtocol": false,
"inBoundary": null,
"inScope": true,
"isEncrypted": false,
@@ -323,7 +293,6 @@
"usesVPN": false
},
{
- "authenticatedWith": false,
"authenticatesDestination": false,
"authorizesSource": false,
"checksDestinationRevocation": false,
@@ -332,7 +301,6 @@
"dstPort": -1,
"findings": [],
"implementsAuthenticationScheme": false,
- "implementsCommunicationProtocol": false,
"inBoundary": null,
"inScope": true,
"isEncrypted": false,
@@ -355,7 +323,6 @@
"usesVPN": false
},
{
- "authenticatedWith": false,
"authenticatesDestination": false,
"authorizesSource": false,
"checksDestinationRevocation": false,
@@ -364,7 +331,6 @@
"dstPort": -1,
"findings": [],
"implementsAuthenticationScheme": false,
- "implementsCommunicationProtocol": false,
"inBoundary": null,
"inScope": true,
"isEncrypted": false,
@@ -387,7 +353,6 @@
"usesVPN": false
},
{
- "authenticatedWith": false,
"authenticatesDestination": false,
"authorizesSource": false,
"checksDestinationRevocation": false,
@@ -396,7 +361,6 @@
"dstPort": -1,
"findings": [],
"implementsAuthenticationScheme": false,
- "implementsCommunicationProtocol": false,
"inBoundary": null,
"inScope": true,
"isEncrypted": false,
@@ -419,7 +383,6 @@
"usesVPN": false
},
{
- "authenticatedWith": false,
"authenticatesDestination": false,
"authorizesSource": false,
"checksDestinationRevocation": false,
@@ -428,7 +391,6 @@
"dstPort": -1,
"findings": [],
"implementsAuthenticationScheme": false,
- "implementsCommunicationProtocol": false,
"inBoundary": null,
"inScope": true,
"isEncrypted": false,
@@ -451,7 +413,6 @@
"usesVPN": false
},
{
- "authenticatedWith": false,
"authenticatesDestination": false,
"authorizesSource": false,
"checksDestinationRevocation": false,
@@ -460,7 +421,6 @@
"dstPort": -1,
"findings": [],
"implementsAuthenticationScheme": false,
- "implementsCommunicationProtocol": false,
"inBoundary": null,
"inScope": true,
"isEncrypted": false,
diff --git a/tests/test_private_func.py b/tests/test_private_func.py
index 1fe3bc4..0b8e7ce 100644
--- a/tests/test_private_func.py
+++ b/tests/test_private_func.py
@@ -35,12 +35,12 @@ def test_write_once(self):
user.name = "Computer"
def test_kwargs(self):
- user = Actor("User", isAdmin=True)
- self.assertEqual(user.isAdmin, True)
+ user = Actor("User", authenticatesDestination=True)
+ self.assertEqual(user.authenticatesDestination, True)
user = Actor("User")
- self.assertEqual(user.isAdmin, False)
- user.isAdmin = True
- self.assertEqual(user.isAdmin, True)
+ self.assertEqual(user.authenticatesDestination, False)
+ user.authenticatesDestination = True
+ self.assertEqual(user.authenticatesDestination, True)
def test_load_threats(self):
tm = TM("TM")
@@ -85,7 +85,6 @@ def test_defaults(self):
)
db = Datastore(
"PostgreSQL",
- isSQL=True,
port=5432,
protocol="PostgreSQL",
isEncrypted=False,
@@ -178,7 +177,7 @@ def test_defaults(self):
user = Actor("User", inBoundary=internet)
server = Server("Server")
- db = Datastore("DB", inBoundary=cloud, isSQL=True)
+ db = Datastore("DB", inBoundary=cloud)
func = Datastore("Lambda function", inBoundary=cloud)
request = Dataflow(user, server, "request")
@@ -205,7 +204,7 @@ def test_defaults(self):
{"target": func, "condition": "not any(target.inputs)"},
{
"target": server,
- "condition": "any(f.sink.oneOf(Datastore) and f.sink.isSQL "
+ "condition": "any(f.sink.oneOf(Datastore) "
"for f in target.outputs)",
},
]
diff --git a/tm.py b/tm.py
index 3272197..4abf6e5 100755
--- a/tm.py
+++ b/tm.py
@@ -27,28 +27,22 @@
user.levels = [2]
web = Server("Web Server")
-web.OS = "Ubuntu"
web.isHardened = True
web.sanitizesInput = False
web.encodesOutput = True
web.authorizesSource = False
db = Datastore("SQL Database")
-db.OS = "CentOS"
db.isHardened = False
db.inBoundary = server_db
-db.isSQL = True
db.inScope = True
db.maxClassification = Classification.RESTRICTED
db.levels = [2]
secretDb = Datastore("Real Identity Database")
-secretDb.OS = "CentOS"
secretDb.isHardened = True
secretDb.inBoundary = server_db
-secretDb.isSQL = True
secretDb.inScope = True
-secretDb.storesPII = True
secretDb.maxClassification = Classification.TOP_SECRET
my_lambda = Lambda("AWS Lambda")