Overview
Σαν γενικότερη αρχή έχουμε το να μην βγάζουμε ένα SQL Server instance στο internet. Αυτό όμως μπορεί να πρέπει να γίνει ιδιαίτερα σε καταστάσεις όπως αυτές που ζούμε σήμερα με την πανδημία. Αν θα πρέπει να προχωρήσουμε σε κάτι τέτοιο τουλάχιστον ας το κάνουμε σωστά.
Αρκετές είναι οι περιπτώσεις που θέλουμε να δώσουμε πρόσβαση σε κάποιο SQL Server instance μέσω internet για συγκεκριμένους χρήστες που κυρίως είναι αυτοί που είναι επιφορτισμένοι με την υποστήριξη του, και αυτό θέλουμε να γίνει με το μέγιστο βαθμό ασφάλειας.
Εκτός όμως από αυτό μπορεί να θέλουμε να κάνουμε mapping τα connections σε συγκεκριμένο NUMA όπως έχω γράψει σε παλαιότερο άρθρο μου. Configuring and Mapping Connections to specific ports and processors to NUMA nodes
Note
Φυσικά από μόνο του αυτό δεν φτάνει καθώς θα πρέπει να συνδυαστεί με τα αυστηρά firewall rules που θα πρέπει να δημιουργηθούν και που όλοι εμπιστευόμαστε.
Create New Endpoint
Για να γίνει κάτι τέτοιο θα πρέπει να δημιουργήσουμε ένα νέο endpoint του οποίου φυσικά την port θα ορίσουμε στα firewall rules. Όπως στο παρακάτω παράδειγμα όπου φτιάχνω ένα νέο endpoint το οποίο ονομάζω SupportConnetion και στο οποίο ορίζω σαν port την 1500 (μπορείτε να βάλετε όποια θέλετε αρκεί να μην χρησιμοποιείται από αλλού)
Create Endpoint
USE master;
GO
CREATE ENDPOINT [SupportConnection]
STATE = STARTED
AS TCP
(LISTENER_PORT = 1500, LISTENER_IP = ALL)
FOR TSQL() ;
GO
Εάν δούμε ποια είναι διαθέσιμα endpoints θα δούμε και αυτό που δημιουργήσαμε αλλά και το default TCP endpoint.
Check available Endpoints
SELECT * FROM sys.endpoints;
GO
Available Endpoints
name |
endpoint_id |
principal_id |
protocol |
protocol_desc |
type |
type_desc |
state |
state_desc |
is_admin_endpoint |
Dedicated Admin Connection |
1 |
1 |
2 |
TCP |
2 |
TSQL |
0 |
STARTED |
1 |
TSQL Local Machine |
2 |
1 |
4 |
SHARED_MEMORY |
2 |
TSQL |
0 |
STARTED |
0 |
TSQL Named Pipes |
3 |
1 |
3 |
NAMED_PIPES |
2 |
TSQL |
0 |
STARTED |
0 |
TSQL Default TCP |
4 |
1 |
2 |
TCP |
2 |
TSQL |
0 |
STARTED |
0 |
TSQL Default VIA |
5 |
1 |
5 |
VIA |
2 |
TSQL |
0 |
STARTED |
0 |
SupportConnection |
65536 |
259 |
2 |
TCP |
2 |
TSQL |
0 |
STARTED |
0 |
Restore access on default TCP endpoint to public
Στο σημείο αυτό θα πρέπει να επισημανθεί ότι κάθε φορά που φτιάχνουμε ένα νέο endpoint "φεύγει" από το default TCP endpoint το CONNECT permission από το Public Role. Αυτό δεν θέλουμε να το χάσουμε καθώς θέλουμε όλοι τα εσωτερικά connections να δουλεύουν και για αυτό θα πρέπει να το επαναφέρουμε χρησιμοποιώντας το παρακάτω Grant statement.
Restore access on default TCP endpoint to public
GRANT CONNECT ON ENDPOINT::[TSQL Default TCP] to [public];
Set access on endpoint to appropriate group or logins
Επόμενο βήμα είναι να δώσουμε access στα Logins που θέλουμε να χρησιμοποιούν αυτό το endpoint.
Set access on SupportConnection endpoint to appropriate group or login
GRANT CONNECT ON ENDPOINT::[SupportConnection] to [ADVENTUREWORKS\SQLSupport];
Set New Endpoint Port to TCP connections
Το τελευταίο βήμα είναι να ορίσουμε στην νέα endpoint port στα TCP Ports μέσα από το SQL Server Configuration Manager όπως δείχνω στο παρακάτω image.
Note
Απαιτείται restart του SQL Server service
Test your solution
Μπορούμε να δοκιμάσουμε αν αυτό που έχουμε φτιάξει δουλεύει με την απλή χρήση ενός sqlcmd στο οποίο φυσικά θα χρησιμοποιήσουμε την νέα port αλλά θα πρέπει να έχουμε μπει και ένα από τα logins που επιτρέπετε να την χρησιμοποιήσουν.
//Antonios Chatzipavlis