Release Notes
1.0.0
Added
- Initial release with SMB2/SMB3 CSV ingestion.
This document explains how to configure the SMB File Share EDM plugin v1.0.0 with the Exact Data Match plugin of the Netskope Cloud Exchange platform. This plugin is used to fetch a CSV file from a remote SMB server (Windows or Samba) and to generate EDM hashes of the pulled CSV file. The plugin supports SMB protocol version from SMB 2.0.2 to SMB 3.1.1.
Prerequisites
To complete the configuration, you need:
- A Netskope tenant (or multiple, for example, production and development/test instances).
- A Netskope Cloud Exchange tenant with the Tenant plugin and Exact Data Match plugin already configured.
- SMB server configured in Windows/Linux/Isilon instance with read access to the SMB Shared Directory and CSV files with appropriate data structure.
SMB File Share EDM Plugin Support
This plugin fetches data from a SMB server supporting SMB 2.0.2 to SMB 3.1.1 and generates Exact Data Match (EDM) hashes according to the defined plugin configurations.
| Feature | Support |
|---|---|
| Pull | Yes |
| Push | No |
SMB Server Permissions
| Permission Type | Requirement |
|---|---|
| SSH Access | Required |
| File Read Access | Required |
| Network Share Access | Required |
| Port Access | 445(SMB) |
Required Permissions
- Users should have read access to the shared folder and CSV file.
- Network connectivity to port 445.
- SMB service enabled on the server.
- Sufficient disk space on Cloud Exchange for temporary file processing.
API Details
List of Libraries Used to Access Remote SMB File Share
This plugin uses Python libraries and the SMB protocol stack to establish secure connections to Windows SMB servers and transfer CSV/TXT files by navigating shared directories.
Library: smbclient
Usage: smbclient is a high-level Python wrapper that provides simple file-system-like functions (register_session, stat, open_file, reset_connection_cache) to connect and interact with Windows SMB shared directories. The plugin uses smbprotocol.exceptions (SMBException, SMBResponseException) only for exception handling when SMB operations fail.
Register session (establish connection + auth)
from ..lib import smbclient
smbclient.register_session(
server,
username=username,
password=password,
port=port,
)
Build UNC and verify connection
unc_path = self._build_unc_path(
server,
directory_path,
file_path,
)
smbclient.stat(unc_path)
Verify file exist
# Check if file exists
stat_result = smbclient.stat(unc_path)
# Check it's not a directory
if stat.S_ISDIR(stat_result.st_mode):
Download a CSV file via SMB
with smbclient.open_file(unc_path, mode="rb") as remote_file:
with open(csv_file_path, "wb") as file_object:
if record_count:
# Partial file retrieval (for sample data)
# +1 to include header row
lines_to_read = record_count + 1
for _ in range(lines_to_read):
line = remote_file.readline()
if not line:
break
file_object.write(line)
else:
# Full file retrieval
shutil.copyfileobj(remote_file, file_object)
Clean up sessions
smbclient.reset_connection_cache(fail_on_error=False)
Performance Matrix
Here is the performance reading conducted for fetching and sanitizing ~1M Rows (25 columns, per column ~50 characters long string, 1.3 GB size, Avg Column Uniqueness: ~96%, Avg Row Uniqueness: ~96%) CSV file on a Large CE instance with these specifications:
| Description | Specification |
|---|---|
| Stack details | Size: Large RAM: 32 GB CPU: 16 Cores |
| CSV data fetched from SMB File Share Without Sanitization | ~7K rows/sec |
Note
For CE instance disk space, refer to this documentation.
Workflow
- Get your server credentials and file paths.
- Configure the SMB File Share EDM Plugin.
- Configure sharing between SMB File Share EDM Plugin and Tenant.
- Validate the SMB File Share EDM Plugin.
Watch a Video
Click play to watch a video.
Get a Shared Directory from the SMB Server
SMB Server hosted in Windows
- Run PowerShell as Administrator.
- Run command in the PowerShell:
Get-SmbShareExample Output:
Name ScopeName Path
—-- --------- ----
ADMIN$ * C:\Windows
C$ * C:\
MyShare * C:\SMBShareWhat It Means:
- Name → Share name
- Path → Actual folder location
- Shares ending with $ (like
C$,ADMIN$) are hidden administrative shares.
SMB Server hosted in Linux
- Samba shares are defined inside
/etc/samba/smb.conf. - In Linux terminal, run:
testparm -s
- Look for sections like:
[shared]
path = /srv/samba/shared - Every section below [global] is a shared folder.
[Documents]
path = /home/devuser/docsWhat it means:
- Share name → Documents
- Actual folder →
/home/devuser/docs
SMB Server hosted in Isilon
- Log in to OneFS.

- Go to Protocols and select SMB.

- Open the Shares Section.

- You will see a list of configured SMB shares.
- Look at the Path column. This shows the actual filesystem directory (usually under /ifs) that is shared via SMB.
Example table:
Share Name Path
test-share /ifs/data/test
Finance /ifs/data/finance - The Path value (
/ifs/...) is the directory being shared.
Setup for kerberos when using domain name/FQDN instead of an IP address
- Install Kerberos Utilities Inside Core Container.
- Access the core container:
docker exec -it -u0 <core-container> bash
- Install Kerberos packages.
Ubuntu/Debian:apt update && apt install -y krb5-user smbclient
- RHEL/CentOS:
yum install -y krb5-workstation samba-client
- Configure Kerberos: (
krb5.conf). - Create or update:
/etc/krb5.conf - Add realm configuration:
[realms] EXAMPLE.COM = { kdc = dc01.example.com admin_server = dc01.example.com } [domain_realm] .example.com = EXAMPLE.COM example.com = EXAMPLE.COMNote
- Realm must usually be uppercase.
- KDC should point to the domain controller.
- DNS resolution must work correctly inside the container.
- Replace these values:
Placeholder Replace With EXAMPLE.COM Your AD/Kerberos realm dc01.example.com Your Domain Controller / KDC hostname example.com Your domain
- Update the
docker-compose.yml. - Edit
docker-compose.ymland add extra_hosts in core service:services: core: extra_hosts: - "<domain/FQDN>:<IP>"
- Restart Cloud Exchange, and configure the plugin with domain/FQDN of your SMB Server.
sudo ./stop && sudo ./start
Configure the SMB File Share EDM Plugin
- Log in to Cloud Exchange and go to Settings > Plugin Store.
- Search for and select the SMB File Share EDM v1.0.0 plugin box.

- Enter the Basic Information:
- Configuration Name: Enter a name appropriate for your integration.
- Sync Interval: Adjust Sync Interval as per your requirement. (Default: 12 hours).

Note
The configuration name you provide will be used to give the name to the generated hash file to share with the Netskope Tenant. Be aware that if you later delete this configuration and create a new one with the same name, the hash file may already exist in the Netskope Tenant. In such cases, attempting to push the hash file to the tenant will result in an error, as the file with the same name already exists. Consider using a unique name to avoid this issue.
- Click Next and enter the Configuration Parameters:
- SMB Server Hostname/IP: Hostname or IP address of the SMB server from which the CSV file should be pulled.
- Port: TCP port for SMB connection (default 445).
- Username: Username with read access to the shared directory.
- Password: Password for the provided username.
- Share Directory Name: The SMB share name. E.g. If the full UNC path is ‘\server\share\path\file.csv’, enter ‘share’. For getting this, follow steps provided in Get Shared Directory from the SMB Server.
- CSV File Path: Provide a CSV file name or path of the CSV file relative to Share Directory Name. E.g. If the full UNC path is ‘\server\share\path\file.csv’, enter ‘path\file.csv’. Use backslashes (\) only. Note: Only .csv/.txt files with max 25 columns are supported. For getting this, follow steps provided in Get Shared Directory from the SMB Server.
- Delimiter: Single character delimiter used in the CSV/TXT file (e.g. comma, pipe, semicolon).
- Remove Quotes: Mark as checked if your CSV encloses fields in double quotes, especially when values contain commas. Quoted fields will be parsed as single columns. Improper quote placement may cause rows to be skipped.
Note
By default, quotes are treated as literal text. Enable Remove Quotes toggle if your CSV uses double quotes to encapsulate fields that contain commas (like
"123 ABC Street, Suite 100"). This ensures the field is treated as a single column. Note that this mode requires strict CSV formatting. If a field starts with a quote, any character, including a space, following the closing quote but preceding the comma (like"Word",) will cause the row to be skipped.
- Click Next and enter the Hash Generation and Sanitization Parameters.
Select the appropriate options for sanitization and hash generation operations:
- Sanitization (Name Column): Sanitize the content by checking the Name Column checkbox. (Default: Unchecked). The Sanitization Process performs the following actions:
- One character: The cell will be marked as invalid if it contains only one character.
- Digits: Cells containing digits will be marked as invalid.
- Stopwords: Cells that match a stopword from the list will be marked as invalid (This works only if the Remove Stopwords checkbox is enabled).
- Non-alphanumeric characters: Remove all special characters to validate the cell.
- Hash Generation is divided into two parts:
- Normalization: Select the value from dropdown to normalize the data value. (Default: None)
- Create Dictionary: Select value from dropdown to create dictionary of unique values for selected field that can be used in DLP rule in netskope tenant. (Default: None)
- Remove Stopwords: Mark as checked if you want to remove certain stopwords as part of the sanitization process.(Default:Unchecked) Ensure that Name Column is checked for the applicable field to reflect the changes.

Note
- User Normalization parameter to normalize the fetched results. For example, a number such as 123-45-6789 or 123 45 6789 will be treated as 123456789. Number normalizations ignore characters, such as dots, dashes and spaces. A string normalization ignores the case sensitivity of the letters.
- Use the Create Dictionary option only when necessary, as this operation is resource-intensive and may impact system performance. Choose this option thoughtfully for optimal efficiency.
- Sanitization (Name Column): Sanitize the content by checking the Name Column checkbox. (Default: Unchecked). The Sanitization Process performs the following actions:
- Click Next. Preview the sanitization sample output by clicking Preview Good File or Preview Bad File.

Note
If you are using the plugin with sanitization On, then the performance may be differ due to extra processing.
- Proceed without sanitization: Uncheck this option to proceed with sanitization. (Default: Checked)
Note
All the data will be under consideration for hash generation if this option is Unchecked; otherwise, only the Good File content will be part of the hash generation.
- Proceed without sanitization: Uncheck this option to proceed with sanitization. (Default: Checked)
- Click Save. You will be redirected to Exact Data Match > Plugins page where you can see your configured plugin.

Configure an EDM Sharing Configuration for SMB File Share
A sharing configuration is used to share the generated EDM hashes with the destination platform. To share EDM hashes with your Netskope Tenant, create a sharing configuration using these steps:
- Go to Exact Data Match > Sharing and click Add Sharing Configuration.

- Configure the sharing parameters:
- Source Configuration: Select the configured SMB File Share EDM plugin.
- Destination Configuration: Select a destination where EDM Hash will be shared.
- Target: The value is automatically set according to the selected Destination Configuration.

- Click Save.
Validate the SMB File Share EDM Plugin
Note
Cloud Exchange only stores sensitive pulled data CSV files temporarily until the hash generation and upload process is completed. After that, the stored files are automatically removed.
Validate in Cloud Exchange
To validate the pulling of the configured plugin in Cloud Exchange, go to Settings > Logging and search for the SMB File Share EDM plugin logs.
You can verify the plugin operation from the logs available at Logging in Cloud Exchange:

The status values are as follows:
- Scheduled: Indicates that the sharing has been configured, and the pull and push operations are waiting in the queue for processing.
- Generating Hash: Indicates that the hash generation process has started. This stage includes fetching > validating > sanitization (if enabled) > generating hash.
- Uploading Hash: Indicates that uploading the hash to the destination configuration has started.
- Upload Completed: Indicates that hashes are uploaded to the destination configuration.
- Checking Apply Status: Checking the apply status of hashes to the destination configuration.
- Apply In Progress: The hash process has started and is in progress on the destination.
- Completed: Indicates that the hash file has been pushed successfully to the destination configuration.
- Failed: Indicates that the final result of the action has failed to execute. The actions are Generating Hash/Uploading Hash/Checking Apply Status.
Shared EDM hashes can be verified from the logs available at Logging in Cloud Exchange:

Validate on the Netskope Tenant
To ensure the push of EDM hashes on the Netskope Tenant from the cloud exchange:
- In the Netskope Tenant, go to Policies > DLP.

- Click Edit Rules and select Data Loss Prevention.

- On the Exact Match tab, a list of files is shown.

Troubleshooting the SMB File Share EDM Plugin
Unable to configure the SMB File Share EDM Plugin
If you are unable to configure the SMB File Share EDM plugin, it could be due to one of the following reasons:
- The user doesn’t have permission to read the CSV file.
- Incorrect hostname/server IP address.
- The port is disabled or blocked on the server.
- Network connectivity issues between Cloud Exchange and server.
- The configured SMB server is of version lower than SMB 2.0.2.
What to do:
- Verify credentials are correct.
- Check file permissions on the server.
- Ensure the SSH service is running.
- Verify network connectivity.
- Verify the SMB version configured in the instance, and if it is lower than SMB 2.0.2, upgrade it to version between SMB 2.0.2 to SMB 3.1.1.
CSV file not found or access denied
If you receive errors about file not found or access denied:
What to do:
- Verify the CSV file path is correct and the file exists.
- Ensure the user has read permissions for the file.
- Check if the file is not locked by another process.
Hash generation fails or takes too long
If hash generation fails or performance is poor:
What to do:
- Check available disk space on Cloud Exchange (ensure at least 2x CSV file size).
- Reduce CSV file size or split into smaller files.
- Disable sanitization if not required to improve performance.
- Monitor system resources during processing.
Known Behaviors
- Sanitization can reduce processing speed by approximately 65% but improves data quality.
- Dictionary creation is resource-intensive and should only be used when necessary.
- The plugin creates temporary files during processing that are automatically cleaned up.
- SSH connection timeouts may occur with very large files; consider increasing timeout values.
- Memory usage scales with CSV file size; monitor system resources during large file processing.
Limitations
Each Netskope tenant has a limit of handling up to 5 staging files. If this maximum limit is reached, you may encounter the following error while sharing hashes:
EDM Netskope Exact Data Match [EDM Netskope] Received exit code 400, Error occurred while uploading edm hashes of configuration Linux EDM to the configuration EDM Netskope.
To resolve this error, you have to delete the existing files from staging.

