Fortigate DLP file filtering and more examples


Important facts

  • Requires SSL Deep Inspection to be used.

  • Starting with FortiOS 7.4.x DLP is a licensed feature, free is only File Filter (may change any minute).

  • Archival preserves ALL matched DLP sensor traffic including contents of files/emails, but requires Fortigate with a harddisk.

  • Archiving requires proxy-based sensor/policy.

  • Feature visibility: DLP was removed from GUI in 6.4, 7.0, then returned in recent versions, BUT it is always available in CLI configuration.

  • Starting 7.2.4 configuration commands changed, new ones added - more granularity, more options.

Block downloading PDF and MP4 files (FortiOS up to 7.2.4)

There are pre-defined file types in Fortigate, PDF being one of them, so as the 1st filtering condition I will use file-type pdf. This way DLP will look at files meta-data, regardless of their extensions. But for the .mp4 files there is no such pre-defined file type, so I will have to block it by filename pattern using *.mp4, which is less secure as it is enough for file extension to be changed to something else and Fortigate will not block it.

config dlp filepattern
    edit 3 <-- THIS NUMBER IS USED IN SENSOR
        set name "PDFandMPEG"
        config entries
            edit "PDF"
                set filter-type type
                set file-type pdf
            next
            edit "MPEG"
                set filter-type type
                set file-type mpeg
            next
            edit "*.mp4"  <-- PATTERN IN FILE NAME TO LOOK FOR
            next
        end
    next
end
config dlp sensor
    edit "PDF_MPEG_sensor"
        config filter
            edit 1
                set proto http-get http-post ftp
                set filter-by file-type
                set file-type 3 <-- THIS IS POLICY ID SEE ABOVE
                set action block
            next
        end
    next
end
  • Security rule using the DLP sensor:

config firewall policy
    edit 138
        set srcintf "Dialup3"
        set dstintf "VDOM_EXT"
        set action accept
        set srcaddr "all"
        set dstaddr "all"
        set schedule "always"
        set service "ALL"
        set utm-status enable
        set ssl-ssh-profile "deep-inspection"
        set dlp-sensor "PDF_MPEG_sensor"
        set logtraffic all
        set nat enable
    next
end

In Forward logs the block is seen as (I tried accessing PDF file on UCLA website):

fortigate dlp block

The MP4 file block by the file name pattern is seen as:

fortigate dlp mp4 download block

To the end user, the block message will look:

fortigate dlp block message

DLP logs are located inside Security Events:

fortigate dlp logs
Note
I run all tests with the help of the website https://dlptest.com/https-post/

File Filter (all versions of FortiOS, no lic needed)

File Filter is a dumbed-down version of DLP that does NOT require a DLP license. It allows us to pick from a list of predefined file types and either block or log them. Also we can choose what protocols to look at: http/ftp/pop3/etc. List of supported file types: https://docs.fortinet.com/document/fortigate/7.4.5/administration-guide/610893 .

File Filter does NOT allow blocking by file sizes or patterns/regex inside file content. It is available in GUI.

fortigate dlp file filter

Fortigate up to 7.2.4

  • File type to match:

config dlp filepattern
    edit 4
        set name "blockMP3"
        config entries
            edit "MP3"
                set filter-type type
                set file-type mp3
            next
        end
    next
end
  • DLP sensor combining the above file pattern with protocols to check, and action - block:

config dlp sensor
    edit "MP3block"
        config filter
            edit 1
                set proto http-get http-post ftp
                set filter-by file-type
                set file-type 4
                set action block
            next
        end
    next
end
  • (FortiOS up to 7.2.4) Security rule using DLP sensor and file-filter:

config firewall policy
    edit 138
        set srcintf "Dialup3"
        set dstintf "VDOM_EXT"
        set action accept
        set srcaddr "all"
        set dstaddr "all"
        set schedule "always"
        set service "ALL"
        set utm-status enable
        set ssl-ssh-profile "deep-inspection"
        set dlp-sensor "MP3block"
        set logtraffic all
        set nat enable
    next
end

Fortigate 7.2.4 or newer

  • Set up file-filter profile

config file-filter profile
    edit "MP3block"
        config rules
            edit "MP3typeblock"
                set protocol http ftp smtp
                set action block
                set file-type "mp3"
            next
        end
    next
end
  • Use this profile directly in the security rule:

config firewall policy
    edit 9
        set uuid 6d0debbe-1755-51ef-ca7d-d938a76591a0
        set srcintf "Peer1P1"
        set dstintf "NV5000-EXT"
        set action accept
        set srcaddr "Peer1pool"
        set dstaddr "all"
        set schedule "always"
        set service "ALL"
        set utm-status enable
        set inspection-mode proxy
        set ssl-ssh-profile "deep-inspection"
        set dlp-profile "BlockSSNCCprofile"
        set file-filter-profile "MP3block"
        set logtraffic all
        set nat enable
        set users "yurisk1"
    next
end

Block uploading/downloading documents containing SSN or/and Credit Card numbers (7.2.4 or newer)

FortiOS 7.2.4 added more granularity in matching the content - we now have predefined signatures for Social Security Numbers (SSN), Credit card numbers, and can also search contents of the files for regex or hex string matches.

The flow changed as well:

  • Create dictionary referencing built-in data types and setting match criteria.

  • Create DLP sensor referencing dictionary(s) and adding matching conditions (e.g. how many times to match).

  • Create DLP profile, referencing DLP sensor and setting action, then use this DLP profile in the security policy.

Built-in data types (on what to match)

We have the follwoing data types to be natched on. While we can edit definitions here, I don’t see any reason to do so:

config dlp data-type
    edit "g-credit-card"
        set pattern "\\b([2-6]{1}\\d{3})[- ]?(\\d{4})[- ]?(\\d{2})[- ]?(\\d{2})[- ]?(\\d{2,4})\\b"
        set verify "built-in"
        set look-back 20
        set transform "\\b\\1[- ]?\\2[- ]?\\3[- ]?\\4[- ]?\\5\\b"
    next
    edit "g-hex"
        set pattern "built-in"
    next
    edit "g-keyword"
        set pattern "built-in"
    next
    edit "g-mip-label"
        set pattern "^[[:xdigit:]]{8}-[[:xdigit:]]{4}-[[:xdigit:]]{4}-[[:xdigit:]]{4}-[[:xdigit:]]{12}$"
        set transform "built-in"
    next
    edit "g-regex"
        set pattern "built-in"
    next
    edit "g-ssn-us"
        set pattern "\\b(\\d{3})-(\\d{2})-(\\d{4})\\b"
        set verify "(?<!-)\\b(?!666|000|9\\d{2})\\d{3}-(?!00)\\d{2}-(?!0{4})\\d{4}\\b(?!-)"
        set look-back 12
        set transform "\\b\\1-\\2-\\3\\b"
    next
end

Let’s create dicitonary referencing SSN/Credit cards built-ins:

config dlp dictionary
    edit "SSNCCdict"
        config entries
            edit 1
                set type "g-credit-card" <-- BUILT-INs SEE ABOVE
            next
            edit 2
                set type "g-ssn-us"
            next
        end
    next
end
  • Create DLP sensor:

config dlp sensor
    edit "blockSSNCC"
    set match-type match-any  <-- THIS DEFAULT SO WILL NOT APPEAR
        config entries
            edit 1
                set dictionary "SSNCCdict"
                set count 1    <-- DEFAULT SO WILL NOT APPEAR
            next
        end
    next
end
  • Now, create DLP profile:

config dlp profile
(profile) $ edit BlockSSNCCprofile
new entry 'BlockSSNCCprofile' added

(BlockSSNCCprofile) $ set
comment               Comment.
feature-set           Flow/proxy feature set.
replacemsg-group      Replacement message group used by this DLP profile.
dlp-log               Enable/disable DLP logging.
extended-log          Enable/disable extended logging for data leak prevention.
nac-quar-log          Enable/disable NAC quarantine logging.
full-archive-proto    Protocols to always content archive.
summary-proto         Protocols to always log summary.


(BlockSSNCCprofile) $ config rule

(rule) $ edit 0
new entry '0' added

(0) $ set
name         Filter name.
severity     Select the severity or threat level that matches this filter.
type         Select whether to check the content of messages (an email message)
 or files (downloaded files or email attachments).
proto        Check messages or files over one or more of these protocols.
filter-by    Select the type of content to match.
file-size    Match files this size or larger (0 - 4294967295 kbytes).
file-type    Select the number of a DLP file pattern table to match.
action       Action to take with content that this DLP profile matches.

 (0) $ set action
allow            Allow the content to pass through the FortiGate and do
not create a log message.
log-only         Allow the content to pass through the FortiGate, but write
a log message.
block            Block the content and write a log message.
quarantine-ip    Quarantine all traffic from the IP address and write a log message.

(0) $ set action block
(0) $ set type file   // OR message FOR EMAILS


(0) $ set filter-by
sensor       Use DLP sensors to match content.
encrypted    Look for encrypted files.
none         No content scan.

(0) $ set filter-by sensor
(0) $ set sensor "blockSSNCC"

Final version:

config dlp profile
    edit "BlockSSNCCprofile"
        config rule
            edit 1
                set proto http-get http-post ftp
                set filter-by sensor
                set sensor "blockSSNCC"
                set action block
            next
        end
    next
end
  • Finally, apply UTM, SSL Deep inspection, and DLP profile in the security rule:

config firewall policy
    edit 9
        set srcintf "Peer1P1"
        set dstintf "VMVDOM-EXT"
        set action accept
        set srcaddr "Peer1pool"
        set dstaddr "all"
        set schedule "always"
        set service "ALL"
        set utm-status enable
        set ssl-ssh-profile "deep-inspection"
        set dlp-profile "BlockSSNCCprofile"
        set logtraffic all
        set nat enable
        set users "yurisk1"
    next
end

The block in logs:

fortigate dlp logs2

Block file uploads/downloads when file is an Office file and contains SSN or any file larger than 10K

We can combine all matching conditions: data-type, file size, and file type

  • Search for Office files:

config dlp filepattern
    edit 3
        set name "OfficeDocs"
        config entries
            edit "OFFICE"
                set filter-type type
                set file-type msoffice
            next
            edit "OFFICEX"
                set filter-type type
                set file-type msofficex
            next
        end
    next
end
  • Search for SSNs in contents:

config dlp sensor
    edit "blockSSNCC"
        config entries
            edit 1
                set dictionary "SSNCCdict"
            next
        end
    next
end
  • Final DLP profile to combine the 2 conditions:

config dlp profile
    edit "OFFICEandSIZE"
        config rule
            edit 1
                set proto http-get http-post ftp
                set file-size 10
                set action block
            next
            edit 2
                set severity high
                set proto http-get http-post ftp
                set filter-by sensor
                set file-type 3
                set sensor "blockSSNCC"
                set action block
            next
        end
    next
end
  • And, finally - apply to security policy:

config firewall policy
    edit 9
        set srcintf "Peer1P1"
        set dstintf "VMVDOM-EXT"
        set action accept
        set srcaddr "Peer1pool"
        set dstaddr "all"
        set schedule "always"
        set service "ALL"
        set utm-status enable
        set ssl-ssh-profile "deep-inspection"
        set dlp-profile "OFFICEandSIZE"
        set logtraffic all
        set nat enable
        set users "yurisk1"
    next
end

Debug

For flow-based sensors (warning: a lot of output):

diagnose ips filter set "host  <Source or destination IP address >"
diagnose ips debug enable  all
diagnose debug enable

For proxy-based dlp sensors:

diagnose sys scanunit debug all
-OR-
diag sys scanunit debug dlp
diag wad debug enable category scan
diagnose debug enable

I also write cheat sheets/scripts/guides to help in daily work, so make sure to check out my Github at https://github.com/yuriskinfo and https://www.linkedin.com/in/yurislobodyanyuk/