community.snowflake.com
Open in
urlscan Pro
2606:4700::6812:1075
Public Scan
URL:
https://community.snowflake.com/s/article/Snowflake-Security-Overview-and-Best-Practices
Submission: On July 03 via api from US — Scanned from DE
Submission: On July 03 via api from US — Scanned from DE
Form analysis
2 forms found in the DOM<form id="mktoForm_4014" class="mktoForm1 mktoForm mktoHasWidth mktoLayoutLeft" data-aura-rendered-by="194:0" novalidate="novalidate" style="font-family: Helvetica, Arial, sans-serif; font-size: 13px; color: rgb(51, 51, 51); width: 811px;">
<style type="text/css">
.mktoForm .mktoButtonWrap.mktoSimple .mktoButton {
color: #fff;
border: 1px solid #75ae4c;
padding: 0.4em 1em;
font-size: 1em;
background-color: #99c47c;
background-image: -webkit-gradient(linear, left top, left bottom, from(#99c47c), to(#75ae4c));
background-image: -webkit-linear-gradient(top, #99c47c, #75ae4c);
background-image: -moz-linear-gradient(top, #99c47c, #75ae4c);
background-image: linear-gradient(to bottom, #99c47c, #75ae4c);
}
.mktoForm .mktoButtonWrap.mktoSimple .mktoButton:hover {
border: 1px solid #447f19;
}
.mktoForm .mktoButtonWrap.mktoSimple .mktoButton:focus {
outline: none;
border: 1px solid #447f19;
}
.mktoForm .mktoButtonWrap.mktoSimple .mktoButton:active {
background-color: #75ae4c;
background-image: -webkit-gradient(linear, left top, left bottom, from(#75ae4c), to(#99c47c));
background-image: -webkit-linear-gradient(top, #75ae4c, #99c47c);
background-image: -moz-linear-gradient(top, #75ae4c, #99c47c);
background-image: linear-gradient(to bottom, #75ae4c, #99c47c);
}
</style>
<div class="mktoFormRow">
<div class="mktoFieldDescriptor mktoFormCol" style="margin-bottom: 10px;">
<div class="mktoOffset" style="width: 10px;"></div>
<div class="mktoFieldWrap mktoRequiredField"><label for="Email" id="LblEmail" class="mktoLabel mktoHasWidth" style="width: 0px;">
<div class="mktoAsterix">*</div>
</label>
<div class="mktoGutter mktoHasWidth" style="width: 10px;"></div><input id="Email" name="Email" placeholder="Email Address " maxlength="255" aria-labelledby="LblEmail InstructEmail" type="email"
class="mktoField mktoEmailField mktoHasWidth mktoRequired" aria-required="true" style="width: 250px;"><span id="InstructEmail" tabindex="-1" class="mktoInstruction"></span>
<div class="mktoClear"></div>
</div>
<div class="mktoClear"></div>
</div>
<div class="mktoFieldDescriptor mktoFormCol" style="margin-bottom: 10px;">
<div class="mktoOffset" style="width: 10px;"></div>
<div class="mktoFieldWrap mktoRequiredField"><label for="Country" id="LblCountry" class="mktoLabel mktoHasWidth" style="width: 0px;">
<div class="mktoAsterix">*</div>
</label>
<div class="mktoGutter mktoHasWidth" style="width: 10px;"></div><select id="Country" name="Country" aria-labelledby="LblCountry InstructCountry" class="mktoField mktoHasWidth mktoRequired" aria-required="true" style="width: 250px;">
<option value="">Country *</option>
<option value="United States">United States</option>
<option value="Canada">Canada</option>
<option value="United Kingdom">United Kingdom</option>
<option value="Germany">Germany</option>
<option value="France">France</option>
<option value="Australia">Australia</option>
<option value="Japan">Japan</option>
<option value="Aland Islands">Aland Islands</option>
<option value="Albania">Albania</option>
<option value="Algeria">Algeria</option>
<option value="American Samoa">American Samoa</option>
<option value="Andorra">Andorra</option>
<option value="Angola">Angola</option>
<option value="Anguilla">Anguilla</option>
<option value="Antarctica">Antarctica</option>
<option value="Antigua and Barbuda">Antigua and Barbuda</option>
<option value="Argentina">Argentina</option>
<option value="Armenia">Armenia</option>
<option value="Aruba">Aruba</option>
<option value="Australia">Australia</option>
<option value="Austria">Austria</option>
<option value="Azerbaijan">Azerbaijan</option>
<option value="Bahamas">Bahamas</option>
<option value="Bahrain">Bahrain</option>
<option value="Bangladesh">Bangladesh</option>
<option value="Barbados">Barbados</option>
<option value="Belarus">Belarus</option>
<option value="Belgium">Belgium</option>
<option value="Belize">Belize</option>
<option value="Benin">Benin</option>
<option value="Bermuda">Bermuda</option>
<option value="Bhutan">Bhutan</option>
<option value="Bolivia">Bolivia</option>
<option value="Bosnia and Herzegovina">Bosnia and Herzegovina</option>
<option value="Botswana">Botswana</option>
<option value="Bouvet Island">Bouvet Island</option>
<option value="Brazil">Brazil</option>
<option value="British Indian Ocean Territory">British Indian Ocean Territory</option>
<option value="Brunei Darussalam">Brunei Darussalam</option>
<option value="Bulgaria">Bulgaria</option>
<option value="Burkina Faso">Burkina Faso</option>
<option value="Burundi">Burundi</option>
<option value="Cambodia">Cambodia</option>
<option value="Cameroon">Cameroon</option>
<option value="Canada">Canada</option>
<option value="Cape Verde">Cape Verde</option>
<option value="Cayman Islands">Cayman Islands</option>
<option value="Central African Republic">Central African Republic</option>
<option value="Chad">Chad</option>
<option value="Chile">Chile</option>
<option value="China">China</option>
<option value="Christmas Island">Christmas Island</option>
<option value="Cocos (Keeling) Islands">Cocos (Keeling) Islands</option>
<option value="Colombia">Colombia</option>
<option value="Comoros">Comoros</option>
<option value="Congo">Congo</option>
<option value="Congo The Democratic Republic of The">Congo The Democratic Republic of The</option>
<option value="Cook Islands">Cook Islands</option>
<option value="Costa Rica">Costa Rica</option>
<option value="Cote D'Ivoire (Ivory Coast)">Cote D'Ivoire (Ivory Coast)</option>
<option value="Croatia (Hrvatska)">Croatia (Hrvatska)</option>
<option value="Cyprus">Cyprus</option>
<option value="Czech Republic">Czech Republic</option>
<option value="Denmark">Denmark</option>
<option value="Djibouti">Djibouti</option>
<option value="Dominica">Dominica</option>
<option value="Dominican Republic">Dominican Republic</option>
<option value="Ecuador">Ecuador</option>
<option value="Egypt">Egypt</option>
<option value="El Salvador">El Salvador</option>
<option value="Equatorial Guinea">Equatorial Guinea</option>
<option value="Eritrea">Eritrea</option>
<option value="Estonia">Estonia</option>
<option value="Ethiopia">Ethiopia</option>
<option value="Falkland Islands (Malvinas)">Falkland Islands (Malvinas)</option>
<option value="Faroe Islands">Faroe Islands</option>
<option value="Fiji">Fiji</option>
<option value="Finland">Finland</option>
<option value="France">France</option>
<option value="French Guiana">French Guiana</option>
<option value="French Polynesia">French Polynesia</option>
<option value="French Southern Territories">French Southern Territories</option>
<option value="Gabon">Gabon</option>
<option value="Gambia">Gambia</option>
<option value="Georgia">Georgia</option>
<option value="Germany">Germany</option>
<option value="Ghana">Ghana</option>
<option value="Gibraltar">Gibraltar</option>
<option value="Greece">Greece</option>
<option value="Greenland">Greenland</option>
<option value="Grenada">Grenada</option>
<option value="Guadeloupe">Guadeloupe</option>
<option value="Guam">Guam</option>
<option value="Guatemala">Guatemala</option>
<option value="Guinea">Guinea</option>
<option value="Guinea-Bissau">Guinea-Bissau</option>
<option value="Guyana">Guyana</option>
<option value="Haiti">Haiti</option>
<option value="Heard and McDonald Islands">Heard and McDonald Islands</option>
<option value="Holy See (Vatican City State)">Holy See (Vatican City State)</option>
<option value="Honduras">Honduras</option>
<option value="Hong Kong">Hong Kong</option>
<option value="Hungary">Hungary</option>
<option value="Iceland">Iceland</option>
<option value="India">India</option>
<option value="Indonesia">Indonesia</option>
<option value="Iraq">Iraq</option>
<option value="Ireland">Ireland</option>
<option value="Isle of Man">Isle of Man</option>
<option value="Israel">Israel</option>
<option value="Italy">Italy</option>
<option value="Jamaica">Jamaica</option>
<option value="Japan">Japan</option>
<option value="Jordan">Jordan</option>
<option value="Kazakhstan">Kazakhstan</option>
<option value="Kenya">Kenya</option>
<option value="Kiribati">Kiribati</option>
<option value="Korea Republic of (South)">Korea Republic of (South)</option>
<option value="Kuwait">Kuwait</option>
<option value="Kyrgyzstan">Kyrgyzstan</option>
<option value="Lao People's Democratic Republic">Lao People's Democratic Republic</option>
<option value="Latvia">Latvia</option>
<option value="Lebanon">Lebanon</option>
<option value="Lesotho">Lesotho</option>
<option value="Liberia">Liberia</option>
<option value="Liechtenstein">Liechtenstein</option>
<option value="Lithuania">Lithuania</option>
<option value="Luxembourg">Luxembourg</option>
<option value="Macau">Macau</option>
<option value="Macedonia">Macedonia</option>
<option value="Madagascar">Madagascar</option>
<option value="Malawi">Malawi</option>
<option value="Malaysia">Malaysia</option>
<option value="Maldives">Maldives</option>
<option value="Mali">Mali</option>
<option value="Malta">Malta</option>
<option value="Marshall Islands">Marshall Islands</option>
<option value="Martinique">Martinique</option>
<option value="Mauritania">Mauritania</option>
<option value="Mauritius">Mauritius</option>
<option value="Mayotte">Mayotte</option>
<option value="Mexico">Mexico</option>
<option value="Micronesia Federated States of">Micronesia Federated States of</option>
<option value="Moldova Republic of">Moldova Republic of</option>
<option value="Monaco">Monaco</option>
<option value="Mongolia">Mongolia</option>
<option value="Montenegro">Montenegro</option>
<option value="Montserrat">Montserrat</option>
<option value="Morocco">Morocco</option>
<option value="Mozambique">Mozambique</option>
<option value="Namibia">Namibia</option>
<option value="Nauru">Nauru</option>
<option value="Nepal">Nepal</option>
<option value="Netherlands">Netherlands</option>
<option value="Netherlands Antilles">Netherlands Antilles</option>
<option value="New Caledonia">New Caledonia</option>
<option value="New Zealand">New Zealand</option>
<option value="Nicaragua">Nicaragua</option>
<option value="Niger">Niger</option>
<option value="Nigeria">Nigeria</option>
<option value="Niue">Niue</option>
<option value="Norfolk Island">Norfolk Island</option>
<option value="Northern Mariana Islands">Northern Mariana Islands</option>
<option value="Norway">Norway</option>
<option value="Oman">Oman</option>
<option value="Pakistan">Pakistan</option>
<option value="Palau">Palau</option>
<option value="Palestinian Territory Occupied">Palestinian Territory Occupied</option>
<option value="Panama">Panama</option>
<option value="Papua New Guinea">Papua New Guinea</option>
<option value="Paraguay">Paraguay</option>
<option value="Peru">Peru</option>
<option value="Philippines">Philippines</option>
<option value="Pitcairn">Pitcairn</option>
<option value="Poland">Poland</option>
<option value="Portugal">Portugal</option>
<option value="Puerto Rico">Puerto Rico</option>
<option value="Qatar">Qatar</option>
<option value="Reunion">Reunion</option>
<option value="Romania">Romania</option>
<option value="Russian Federation">Russian Federation</option>
<option value="Saint Helena">Saint Helena</option>
<option value="Saint Kitts and Nevis">Saint Kitts and Nevis</option>
<option value="Saint Lucia">Saint Lucia</option>
<option value="Saint Pierre and Miquelon">Saint Pierre and Miquelon</option>
<option value="Saint Vincent and the Grenadines">Saint Vincent and the Grenadines</option>
<option value="Samoa">Samoa</option>
<option value="San Marino">San Marino</option>
<option value="Sao Tome and Principe">Sao Tome and Principe</option>
<option value="Saudi Arabia">Saudi Arabia</option>
<option value="Senegal">Senegal</option>
<option value="Serbia">Serbia</option>
<option value="Seychelles">Seychelles</option>
<option value="Sierra Leone">Sierra Leone</option>
<option value="Singapore">Singapore</option>
<option value="Slovakia">Slovakia</option>
<option value="Slovenia">Slovenia</option>
<option value="Solomon Islands">Solomon Islands</option>
<option value="Somalia">Somalia</option>
<option value="South Africa">South Africa</option>
<option value="South Georgia and The South Sandwich Island">South Georgia and The South Sandwich Island</option>
<option value="Spain">Spain</option>
<option value="Sri Lanka">Sri Lanka</option>
<option value="Suriname">Suriname</option>
<option value="Svalbard and Jan Mayen Islands">Svalbard and Jan Mayen Islands</option>
<option value="Swaziland">Swaziland</option>
<option value="Sweden">Sweden</option>
<option value="Switzerland">Switzerland</option>
<option value="Taiwan">Taiwan</option>
<option value="Tajikistan">Tajikistan</option>
<option value="Tanzania United Republic of">Tanzania United Republic of</option>
<option value="Thailand">Thailand</option>
<option value="Timor-Leste">Timor-Leste</option>
<option value="Togo">Togo</option>
<option value="Tokelau">Tokelau</option>
<option value="Tonga">Tonga</option>
<option value="Trinidad and Tobago">Trinidad and Tobago</option>
<option value="Tunisia">Tunisia</option>
<option value="Turkey">Turkey</option>
<option value="Turkmenistan">Turkmenistan</option>
<option value="Turks and Caicos Islands">Turks and Caicos Islands</option>
<option value="Tuvalu">Tuvalu</option>
<option value="Uganda">Uganda</option>
<option value="Ukraine">Ukraine</option>
<option value="United Arab Emirates">United Arab Emirates</option>
<option value="United Kingdom">United Kingdom</option>
<option value="United States Minor Outlying Islands">United States Minor Outlying Islands</option>
<option value="Uruguay">Uruguay</option>
<option value="Uzbekistan">Uzbekistan</option>
<option value="Vanuatu">Vanuatu</option>
<option value="Venezuela">Venezuela</option>
<option value="Viet Nam">Viet Nam</option>
<option value="Virgin Islands (British)">Virgin Islands (British)</option>
<option value="Virgin Islands (U.S.)">Virgin Islands (U.S.)</option>
<option value="Wallis and Futuna Islands">Wallis and Futuna Islands</option>
<option value="Western Sahara">Western Sahara</option>
<option value="Yemen">Yemen</option>
<option value="Zambia">Zambia</option>
<option value="Zimbabwe">Zimbabwe</option>
</select><span id="InstructCountry" tabindex="-1" class="mktoInstruction"></span>
<div class="mktoClear"></div>
</div>
<div class="mktoClear"></div>
</div>
<div class="mktoPlaceholder mktoPlaceholderState"></div>
<div class="mktoClear"></div>
</div>
<div class="mktoFormRow">
<div class="mktoPlaceholder mktoPlaceholderMarketing_Opt_in__c"></div>
<div class="mktoClear"></div>
</div>
<div class="mktoFormRow">
<div class="mktoFormCol" style="margin-bottom: 10px;">
<div class="mktoOffset mktoHasWidth" style="width: 10px;"></div>
<div class="mktoFieldWrap">
<div class="mktoHtmlText mktoHasWidth" style="width: 260px;"><span style="font-size: 10px;">By submitting this form, I understand Snowflake will process my personal information in accordance with their
<strong><a href="https://www.snowflake.com/privacy-policy/" target="_blank">Privacy Notice</a></strong>. Additionally, I consent to my information being shared with Event Partners in accordance with Snowflake’s
<strong><a href="https://www.snowflake.com/legal/snowflake-event-privacy-notice/" target="_blank" id="">Event Privacy Notice</a></strong>. I understand I may withdraw my consent or update my preferences
<strong><a href="https://info.snowflake.com/2020-Snowflake-Preference-Center.html" target="_blank" id="">here</a></strong> at any time.</span></div>
<div class="mktoClear"></div>
</div>
<div class="mktoClear"></div>
</div>
<div class="mktoClear"></div>
</div>
<div class="mktoFormRow"><input type="hidden" name="utm_adgroup__c" class="mktoField mktoFieldDescriptor mktoFormCol" value="https://community.snowflake.com/s/article/Snowflake-Security-Overview-and-Best-Practices" style="margin-bottom: 10px;">
<div class="mktoClear"></div>
</div>
<div class="mktoFormRow"><input type="hidden" name="utm_campaign__c" class="mktoField mktoFieldDescriptor mktoFormCol" value="" style="margin-bottom: 10px;">
<div class="mktoClear"></div>
</div>
<div class="mktoFormRow"><input type="hidden" name="utm_content__c" class="mktoField mktoFieldDescriptor mktoFormCol" value="" style="margin-bottom: 10px;">
<div class="mktoClear"></div>
</div>
<div class="mktoFormRow"><input type="hidden" name="utm_medium__c" class="mktoField mktoFieldDescriptor mktoFormCol" value="" style="margin-bottom: 10px;">
<div class="mktoClear"></div>
</div>
<div class="mktoFormRow"><input type="hidden" name="utm_source__c" class="mktoField mktoFieldDescriptor mktoFormCol" value="" style="margin-bottom: 10px;">
<div class="mktoClear"></div>
</div>
<div class="mktoFormRow"><input type="hidden" name="utm_term__c" class="mktoField mktoFieldDescriptor mktoFormCol" value="" style="margin-bottom: 10px;">
<div class="mktoClear"></div>
</div>
<div class="mktoFormRow"><input type="hidden" name="utm_region__c" class="mktoField mktoFieldDescriptor mktoFormCol" value="" style="margin-bottom: 10px;">
<div class="mktoClear"></div>
</div>
<div class="mktoButtonRow"><span class="mktoButtonWrap mktoSimple" style="margin-left: 120px;"><button type="submit" class="mktoButton">Subscribe Now</button></span></div><input type="hidden" name="formid" class="mktoField mktoFieldDescriptor"
value="4014"><input type="hidden" name="munchkinId" class="mktoField mktoFieldDescriptor" value="252-RFO-227"><input type="hidden" name="formFillCompanyName" class="mktoField mktoFieldDescriptor" value=""><input type="hidden"
name="formFillFirstName" class="mktoField mktoFieldDescriptor" value=""><input type="hidden" name="formFillLastName" class="mktoField mktoFieldDescriptor" value=""><input type="hidden" name="formfillEmailAddress"
class="mktoField mktoFieldDescriptor" value=""><input type="hidden" name="formFillJob_Function__c" class="mktoField mktoFieldDescriptor" value=""><input type="hidden" name="formFillJobTitle" class="mktoField mktoFieldDescriptor" value=""><input
type="hidden" name="formFillRole" class="mktoField mktoFieldDescriptor" value="">
</form>
<form class="mktoForm1 mktoForm mktoHasWidth mktoLayoutLeft" data-aura-rendered-by="194:0" novalidate="novalidate"
style="font-family: Helvetica, Arial, sans-serif; font-size: 13px; color: rgb(51, 51, 51); visibility: hidden; position: absolute; top: -500px; left: -1000px; width: 1600px;"></form>
Text Content
Loading ×Sorry to interrupt CSS Error Refresh * Home * User Groups * Discussions * Snowflake Forums * StackOverflow * Reddit * Community Leaders * Data Superheroes * Snowflake Squad * Support * Knowledge Base * Documentation * Status * Releases & Announcements * Resources * Developers * Education & Training * Blog * Ideas Board * Partner Portal * Start For Free * Snowcases * More CREATE ACCOUNTSIGN IN KNOWLEDGE BASE ARTICLES SearchLoading Can't find what you're looking for? Ask The Community SNOWFLAKE SECURITY OVERVIEW AND BEST PRACTICES April 26, 2024 Solution INTRODUCTION This document provides an overview of security features and best practice guidelines for securing your data in Snowflake. Snowflake secures customer data using defense in depth with three security layers. * Network Security * IAM * Data Encryption After setting up the security controls, you can monitor them using the guidelines listed under the Monitoring section. NETWORK SECURITY Network security or isolation provides the first line of defense. The network security best practices are as follows: * Use network policies * Use private connectivity with Snowflake. * Allow firewall to connect client applications to Snowflake. * Allow Snowflake to access your cloud storage location for loading/unloading data. Use network policies to allow “known” client locations (IP ranges) to connect to your Snowflake account while blocking others. Additionally, if you’re using service account users to connect from a client application, SCIM, or Snowflake OAuth integrations, check if you need to configure different network policies (SCIM network policy, OAuth network policy) that overrides the account level network policy. Use private connectivity with Snowflake by connecting to Snowflake over a private IP address using cloud service providers' private connectivity such as AWS PrivateLink or Azure Private Link. With this feature, your Snowflake account appears as a resource in your network. Here’re a few best practices to consider when using this feature. * You’re responsible for setting up DNS to resolve Snowflake's private URL. Using private DNS in your cloud provider network is the best practice as it allows Snowflake account to be resolved from clients running both in the cloud provider network and on-premises. You can then create a DNS forwarding rule for the Snowflake account in your on-premise DNS. * After you’ve configured private connectivity, if you want to block access to the public endpoint, then you can create an account level network policy allowing only your network’s private IP range to connect into Snowflake. * If you want to allow client applications running outside your network to connect into Snowflake, then they would be connecting to your account over a public endpoint. To allow access, based on the use case, you can add the client application’s IP range to the allowed list of account level, user level, or OAuth integration network policy. Allow firewall to connect client applications to Snowflake if your network has a firewall for egress traffic. * Run SYSTEM$ALLOWLIST and/or SYSTEM$ALLOWLIST_PRIVATELINK based on whether you’re allowing public endpoint, the private endpoint, or both to be accessible for your Snowflake account. * Use SnowCD to ensure proper connectivity has been set up with Snowflake. * If you’re using network proxy to inspect egress traffic, then set it up for SSL passthrough. Snowflake doesn’t support SSL terminating proxies. Allow Snowflake to access your cloud storage location for bulk loading/unloading data using COPY by adding Snowflake VPC id for AWS and/or VNet Subnet ids for Azure to your storage policy or firewall rules. IDENTITY AND ACCESS MANAGEMENT Once your Snowflake account is accessible, the next step in gaining access to Snowflake is to authenticate the user. Users must be created in Snowflake prior to any access. Once the user is authenticated, a session is created with roles used to authorize access in Snowflake. This section covers best practices for: 1. Managing users and roles 2. Authentication and single sign-on 3. Sessions 4. Object-level access control (authorization) 5. Column-level access control 6. Row-level access control MANAGING USERS AND ROLES Snowflake recommends using SCIM where supported by your Identity Provider to provision and externally manage users and roles in Snowflake. Identity Providers can be further configured to synchronize users and roles with your Active Directory users and groups. Review the Okta SCIM and Azure AD SCIM FAQs before integrating with these providers. If you can’t use SCIM for any reason, then build your own AD sync tool similar to this one using a Snowflake driver. Note: use it at your own risk as it's a community developed tool and not maintained by Snowflake. Roles in Snowflake are hierarchical, and the best practices for defining role hierarchies are covered in the Object level access control section below. PASSWORD MANAGEMENT: Snowflake recommends using federated single sign-on (SSO) while using passwords for only certain use cases such as for service accounts and users with the Snowflake ACCOUNTADMIN system role. For such cases, the password management best practices are as follows: * Enable built-in Duo multi-factor authentication for additional security. * Use complex and long passwords preferably managed by secrets management or privileged access management (PAM) platforms. See example for how to use Hashicorp Vault with Snowflake. * Rotate passwords at regular intervals. While password expiry is not currently supported by Snowflake, you can use secrets management or privileged access management (PAM) platforms to force password change at regular intervals. Monitor password use in your Snowflake account by: 1. Querying users who have the has_password column set. 2. Querying login_history first_authentication_factor column. 3. Identify a user with ACCOUNTADMIN role for password resets as self-service password reset is not currently supported except for trial accounts. If the ACCOUNTADMIN forgets their password, then contact Snowflake support for a password reset. 4. For users who don’t require a password in Snowflake, set the password property to null. This will ensure that the password as an authentication method isn’t available to those users, and they can’t set the password themselves. 5. Review this FAQ. AUTHENTICATION AND SINGLE SIGN-ON (SSO) Snowflake supports multiple authentication methods based on the interface used, such as client applications using drivers, UI, or Snowpipe. * Snowflake Clients (drivers and SnowSQL) support username/password, OAuth, keypair, external browser, and Okta native authentication. * Snowflake supports two types of OAuth: * Snowflake OAuth where it accepts tokens from a built-in OAuth server * External OAuth where it accepts tokens from a 3rd party OAuth server * External Browser authentication only works for client applications running on a user's machine. It must have browser access, as the driver opens up the system browser redirecting the user to the Snowflake login page for authentication. * Okta native authentication, as the name suggests, only works with Okta and has limitations such as MFA, which must be turned off for the user in Okta. This is a legacy method and is recommended to use only when the client application supports this method and hasn’t added support for OAuth yet. * Snowflake UI supports password and federated authentication using SAML. * If you’re using Snowpipe for data ingestion, then it supports keypair authentication. * Single sign-on (SSO) from client apps is achieved using SAML, OAuth, External Browser, and Okta native authentication methods. Snowflake allows a user to use multiple authentication methods. For example, a user can authenticate with both password and SAML. Based on the client applications you use to connect into Snowflake and their capabilities, you may have to allow multiple authentication methods in your account. Authentication best practices Snowflake recommends creating a spreadsheet listing all the client applications connecting to Snowflake and their authentication capabilities. If the app supports multiple authentication methods, then use the method in the below priority order. Preference #1: OAuth (either Snowflake OAuth or External OAuth) Preference #2: External Browser, if it's a desktop application that doesn’t support OAuth Preference #3: Okta native authentication, if you’re using Okta, and the app supports this method while not supporting OAuth or external browser authentication yet. Preference #4: Key Pair Authentication, mostly used for service account users. Since this requires the client application to manage private keys, complement it with your internal key management software. Preference #5: Password, this should be the last option for applications that don’t support any of the above options. This option is commonly used for service account users connecting from 3rd party ETL apps. Here’re few other best practice recommendations: * For homegrown applications, ask developers to support Snowflake OAuth or External OAuth. If it's a programmatic client application with no access to the browser, you can only use External OAuth as Snowflake OAuth requires browser redirect capabilities. * For SnowSQL and other desktop tools, ask users to use external browser authentication. * Querying as end-users vs. service account users: if you’re connecting into Snowflake using a service account because of client application capabilities or other reasons, and you still want to track the end user submitting the query, then you can pass the end-user details through the query_tag in the session. Be aware that this can easily be spoofed, so check with your security team before implementing it. MULTI-FACTOR AUTHENTICATION (MFA) Snowflake recommends always using MFA as it provides an additional layer of security for user access. There are two ways to enable it for your Snowflake account. 1. Enable it in your identity provider: Users are prompted for MFA when Snowflake redirects the user to the identity provider for authentication. This is a preferred mechanism to use MFA as it allows you to bring your own (BYO) MFA. It works with SAML, OAuth, and External Browser authentication. Additionally, it provides ease of use for end-users as they need to have a single MFA application to manage for accessing Snowflake and other company resources. 2. Built-in Duo MFA: Snowflake offers a built-in MFA powered by Duo Security. Use it only when you are not integrating with an Identity Provider. SESSIONS Once the user is authenticated, Snowflake creates a database session for the user. The client application can then use the session to submit queries into Snowflake. Each session has a 4 hrs of idle (inactivity) timeout. Using a session, new child sessions can be created. For example, the Snowflake classic UI creates child sessions, one per worksheet. The session management best practices are as follows: * Reuse sessions * Close connection when no longer required * Avoid using CLIENT_SESSION_KEEP_ALIVE * Monitor session usage Reuse existing sessions from your client applications to receive the best performance, and avoid delays due to new session creation. Close your client application's connection when no longer required (e.g., calling con.close() for the python driver). Avoid using session parameter CLIENT_SESSION_KEEP_ALIVE to true unless necessary for the use case. By default, Snowflake closes the session after an idle timeout. Still, if this parameter is set to TRUE, then the session remains active indefinitely as long as the connection is active. Too many sessions created with this parameter set to true puts stress on resources and can lead to poor performance. Monitor session usage through the account_usage.sessions view. OBJECT-LEVEL ACCESS CONTROL Roles are used for authorizing access to objects, such as tables, views, and functions, in Snowflake. Roles can contain other roles and have hierarchies. When a database session is created for a user, the primary role is associated with the session. All roles under the hierarchy of the primary role get activated in the session to perform the authorization. Take time to establish a proper role hierarchy model upfront. Snowflake recommends following best practices for access control in addition to reviewing the access control considerations section of Snowflake documentation: * Define functional roles and access roles * Avoid granting access roles to other access roles * Use future grants * Set default_role property for the user * Create a role per user for cross-database join use cases * Use managed access schema to centralize grant management Define two types of logical roles: * functional roles * access roles A functional role hierarchy contains only users or other functional roles, while access roles contain only privileges. Then you would grant access roles to the functional roles. This strategy would allow the functional role hierarchy to mimic your AD group hierarchy. You can keep in sync using external tools as covered in the “Managing users and roles” section above. Do not grant access roles to other access roles. This will help prevent unnecessary role hierarchies that can lead to a suboptimal performance at login time. Instead, grant the privileges directly to the access roles. In the above example, grant the USAGE privilege on the database directly to the DB1_RO, DB1_RW, and DB1_ADMIN roles. Simplify grant management using higher-level access roles and future grants at the database and/or schema level. For example, as described in the above diagram, you can start with 3 access roles at the database level: * DB1_RO (for read-only access) * DB1_RW (for read-write access) * DB1_ADMIN (for admin tasks) Next, assign various privileges to these access roles and then define them as database-level future grants. When new objects are created, then appropriate privileges are automatically assigned to them. Use the default_role property for the user, and set it to their functional role. If you have cross-database joins, such as between a sales database and a marketing database for many databases in an account, then consider creating a role per user instead of creating multiple roles on top of the database roles as the permutations can lead to role explosion that may become difficult to manage. To prevent object owners from granting access to other roles at their discretion, use managed access schemas. It prevents discretionary access control and centralizes grant management. COLUMN-LEVEL ACCESS CONTROL If you want to restrict access to sensitive information present in certain columns such as PII, PHI, or financial data, then Snowflake recommends using the following data governance features that allow you to restrict column access for unauthorized users. 1. Dynamic Data Masking: this is a built-in feature that can dynamically obfuscate column data based on who’s querying it. 2. External Tokenization: integrates with partner solutions to detokenize data at query time for authorized users. 3. Secure Views: you can hide the columns entirely from unauthorized users. Both Dynamic Data Masking and External Tokenization use masking policies to restrict sensitive data access to authorized users. In addition to reviewing the considerations section of the documentation, Snowflake recommends following best practices for masking policies: * Determine up-front if you want to take a centralized vs. decentralized approach for policy management. * Use invoker_role() in policy condition for unauthorized users to view aggregate data while unable to view individual data. * Avoid using the SHA2 function in the policy to allow joins on protected columns for unauthorized users since it can lead to unintended query results. Determine up-front if your organization wants to centralize masking policy management or decentralize it to individual database owning teams. If you want to allow unauthorized users to view aggregate information (such as sum, count) on protected columns, but disallow access to individual data, then create a view with aggregated data represented as a column, and apply masking policy on the underlying table column using the invoker_role() function in the policy condition. If you want to allow unauthorized users to perform joins on protected columns in a query, then use external tokenization instead of dynamic data masking. For this use case, do not use SHA2 cryptographic hash functions with dynamic data masking policies as hash functions can have collisions, however rare they might be. See here. Alternatively, you can use Snowflake’s built-in encryption functions (encrypt / decrypt and encrypt_raw / decrypt_raw) that don’t suffer from SHA2 collision issues.. ROW-LEVEL ACCESS CONTROL You may have tables with mixed data to restrict access to certain rows to only certain users. For example, you may want to restrict the visibility of rows based on the user’s country, such as US employees can only view US order data, while French employees can only view order data from France. To solve this problem, you can create secure views using the CURRENT_ROLE() or CURRENT_USER() context functions to dynamically filter rows for the user querying the view. See here. DATA ENCRYPTION All data stored in Snowflake is transparently encrypted using a key hierarchy (with cloud HSM backed root of trust), which provides enhanced security by encrypting individual pieces of data using a different key. Snowflake also offers the use of a customer-managed key (CMK) in this encryption process through a feature called Tri-Secret Secure. Independent of the Tri-secret secure feature, Snowflake rotates the keys every 30 days, ensuring that new data ingested after 30 days is encrypted using a new key hierarchy. The data encryption best practices are as follows: * Use Tri-Secret secure and review AWS Tri-Secret Secure and Azure Tri-Secret Secure FAQs. * Use automatic key rotation for the CMK as provided by the cloud provider (such as AWS KMS). If, for any reason, you need to manually change your CMK, then contact Snowflake support for assistance. * Remember to enable Tri-Secret Secure in the target account when using the Replication feature to replicate a database to another account. * Enable periodic rekeying in Snowflake if your organization requires rekeying of data at regular intervals * If you want to encrypt/decrypt certain columns in addition to the transparent encryption provided by Snowflake, then use the built-in encryption functions. PREVENT DATA EXFILTRATION Follow the best practices described in the below blog post related to external stage configurations to prevent data exfiltration from your Snowflake account. How to Configure a Snowflake Account to Prevent Data Exfiltration MONITORING You can monitor the usage of Snowflake to meet your organization’s audit and compliance requirements. Every Snowflake account comes with a system-defined, read-only shared database named SNOWFLAKE. It has a schema named ACCOUNT_USAGE containing views that provide access to one year of audit logs. You can use the following views for audit purposes. * LOGIN_HISTORY: contains the log of every connection established with Snowflake. You can determine who logged in from where and using what authentication method. * QUERY_HISTORY: contains the log of every query run in Snowflake. This includes queries against both customer data and metadata such as users, roles, and grants lifecycle. If you need to retain audit logs for more than one year, you can: * move them into custom tables of your Snowflake account (see SnowAlert), or * move them outside of Snowflake into your SIEM or other security solutions. Get detailed info for usersYou can get detailed information on current users using the USERS account_usage view. With this view, you can query for: * Users that have passwords in Snowflake (where HAS_PASSWORD = true) * Users with passwords in Snowflake, if they are changing the password at regular intervals to remain compliant (where PASSWORD_LAST_SET_TIME > dateadd(day, -90, CURRENT_TIMESTAMP() -- hasn’t changed in the last 90 days). * Users using keypair authentication (where HAS_RSA_PUBLIC_KEY = true) * Users using SSO to connect into Snowflake (where HAS_PASSWORD != true and HAS_RSA_PUBLIC_KEY != true) * Users created in the last 30 days (where CREATED_ON > dateadd(day, -30, CURRENT_TIMESTAMP()) * Inactive users (where LAST_SUCCESS_LOGIN > dateadd(day, -30, CURRENT_TIMESTAMP() -- haven’t used Snowflake in the last 30 days) * Disabled users (where DISABLED = true) Who has access to what? To determine who has access to what objects (tables, views, etc.) in Snowflake, join the GRANTS_TO_ROLES and GRANTS_TO_USERS account_usage views. You would have to create a recursive query to get this info, as roles are hierarchical in nature. You can also visualize the role hierarchy by following this blog post. Query the ROLES view to get information on when they were created or deleted. How was the user authenticated when performing a certain query? For a given query, if you want to know how the user was authenticated, you can join QUERY_HISTORY and SESSIONS views on SESSION_ID. SUMMARY The security best practices mentioned above will help you protect your data and your business’s reputation. Remember that security is a moving target, and the cybercriminals get more advanced every day. So, most importantly, stay current on the latest trends for attacks and the newest prevention technology. For help implementing the best practices in this article, contact Snowflake Support. Was this article helpful? YesNo HELPFUL LINKS Support Portal Case Submission Updates Snowflake Global Support Phone Numbers Snowflake Status Page Release Notes Behavior Changes MOST VIEWED * COPY_HISTORY View (Account Usage): "Load in progress" No Longer Shown in STATUS Column * SESSIONS and LOGIN_HISTORY Views (Account Usage): Events from Internal Users Removed from Views * Data Sharing Usage Views: Changes to Column in Views * USERS View (Account Usage): New Column in View * QUERY_HISTORY View (Account Usage): New Columns Nothing found Loading * RESOURCES * Documentation * Educational Services * Snowflake University * Get Started in the Snowflake Community * Knowledge Base * PRODUCTS * Overview * Architecture * Security * Pricing * ABOUT * About Snowflake * Team * Board * Careers Sign Up for snowflake communications * * Country *United StatesCanadaUnited KingdomGermanyFranceAustraliaJapanAland IslandsAlbaniaAlgeriaAmerican SamoaAndorraAngolaAnguillaAntarcticaAntigua and BarbudaArgentinaArmeniaArubaAustraliaAustriaAzerbaijanBahamasBahrainBangladeshBarbadosBelarusBelgiumBelizeBeninBermudaBhutanBoliviaBosnia and HerzegovinaBotswanaBouvet IslandBrazilBritish Indian Ocean TerritoryBrunei DarussalamBulgariaBurkina FasoBurundiCambodiaCameroonCanadaCape VerdeCayman IslandsCentral African RepublicChadChileChinaChristmas IslandCocos (Keeling) IslandsColombiaComorosCongoCongo The Democratic Republic of TheCook IslandsCosta RicaCote D'Ivoire (Ivory Coast)Croatia (Hrvatska)CyprusCzech RepublicDenmarkDjiboutiDominicaDominican RepublicEcuadorEgyptEl SalvadorEquatorial GuineaEritreaEstoniaEthiopiaFalkland Islands (Malvinas)Faroe IslandsFijiFinlandFranceFrench GuianaFrench PolynesiaFrench Southern TerritoriesGabonGambiaGeorgiaGermanyGhanaGibraltarGreeceGreenlandGrenadaGuadeloupeGuamGuatemalaGuineaGuinea-BissauGuyanaHaitiHeard and McDonald IslandsHoly See (Vatican City State)HondurasHong KongHungaryIcelandIndiaIndonesiaIraqIrelandIsle of ManIsraelItalyJamaicaJapanJordanKazakhstanKenyaKiribatiKorea Republic of (South)KuwaitKyrgyzstanLao People's Democratic RepublicLatviaLebanonLesothoLiberiaLiechtensteinLithuaniaLuxembourgMacauMacedoniaMadagascarMalawiMalaysiaMaldivesMaliMaltaMarshall IslandsMartiniqueMauritaniaMauritiusMayotteMexicoMicronesia Federated States ofMoldova Republic ofMonacoMongoliaMontenegroMontserratMoroccoMozambiqueNamibiaNauruNepalNetherlandsNetherlands AntillesNew CaledoniaNew ZealandNicaraguaNigerNigeriaNiueNorfolk IslandNorthern Mariana IslandsNorwayOmanPakistanPalauPalestinian Territory OccupiedPanamaPapua New GuineaParaguayPeruPhilippinesPitcairnPolandPortugalPuerto RicoQatarReunionRomaniaRussian FederationSaint HelenaSaint Kitts and NevisSaint LuciaSaint Pierre and MiquelonSaint Vincent and the GrenadinesSamoaSan MarinoSao Tome and PrincipeSaudi ArabiaSenegalSerbiaSeychellesSierra LeoneSingaporeSlovakiaSloveniaSolomon IslandsSomaliaSouth AfricaSouth Georgia and The South Sandwich IslandSpainSri LankaSurinameSvalbard and Jan Mayen IslandsSwazilandSwedenSwitzerlandTaiwanTajikistanTanzania United Republic ofThailandTimor-LesteTogoTokelauTongaTrinidad and TobagoTunisiaTurkeyTurkmenistanTurks and Caicos IslandsTuvaluUgandaUkraineUnited Arab EmiratesUnited KingdomUnited States Minor Outlying IslandsUruguayUzbekistanVanuatuVenezuelaViet NamVirgin Islands (British)Virgin Islands (U.S.)Wallis and Futuna IslandsWestern SaharaYemenZambiaZimbabwe By submitting this form, I understand Snowflake will process my personal information in accordance with their Privacy Notice. Additionally, I consent to my information being shared with Event Partners in accordance with Snowflake’s Event Privacy Notice. I understand I may withdraw my consent or update my preferences here at any time. Subscribe Now Privacy Notice | Site Terms | Cookies Settings | Do not Share My personal Information © 2024 Snowflake Inc. All Rights Reserved | If you'd rather not receive future emails from Snowflake, unsubscribe here or customize your communication preferences * * * * Loading SNOWFLAKE'S USE OF COOKIES We use cookies to enhance your experience, to display customized content, and to analyze site traffic. By clicking "Accept Cookies" or closing this banner, you provide your consent to our use of cookies. To learn more about the cookies we use and to set your own preferences, see ourCookie Statement. Cookies Settings Reject All Accept All Cookies PRIVACY PREFERENCE CENTER Your Opt Out Preference Signal is Honored * YOUR PRIVACY * STRICTLY NECESSARY COOKIES * PERFORMANCE COOKIES * FUNCTIONAL COOKIES * TARGETING COOKIES YOUR PRIVACY When you visit any website, it may store or retrieve information on your browser, mostly in the form of cookies. This information might be about you, your preferences or your device and is mostly used to make the site work as you expect it to. The information does not usually directly identify you, but it can give you a more personalized web experience. Because we respect your right to privacy, you can choose not to allow some types of cookies. Click on the different category headings to find out more and change our default settings. However, blocking some types of cookies may impact your experience of the site and the services we are able to offer. More information STRICTLY NECESSARY COOKIES Always Active These cookies are necessary for the website to function and cannot be switched off. They are usually only set in response to actions made by you which amount to a request for services, such as setting your privacy preferences, logging in or filling in forms. You can set your browser to block or alert you about these cookies, but some parts of the site will not then work. These cookies do not store any personally identifiable information. Cookies Details PERFORMANCE COOKIES Performance Cookies These cookies allow us to count visits and traffic sources so we can measure and improve the performance of our site. They help us to know which pages are the most and least popular and see how visitors move around the site. All information these cookies collect is aggregated and therefore anonymous. If you do not allow these cookies we will not know when you have visited our site, and will not be able to monitor its performance. Cookies Details FUNCTIONAL COOKIES Functional Cookies These cookies enable the website to provide enhanced functionality and personalisation. They may be set by us or by third party providers whose services we have added to our pages. If you do not allow these cookies then some or all of these services may not function properly. Cookies Details TARGETING COOKIES Targeting Cookies These cookies may be set through our site by our advertising partners. They may be used by those companies to build a profile of your interests and show you relevant adverts on other sites. They do not store directly identifiable personal information, but are based on uniquely identifying your browser and internet device. If you do not allow these cookies, you will experience less targeted advertising. Cookies Details Back Button COOKIE LIST Filter Button Consent Leg.Interest checkbox label label checkbox label label checkbox label label Clear checkbox label label Apply Cancel Confirm My Choices Allow All