Securing a Private Intranet?
crustythecrab asks: "My company wants to take a web-based data management system I wrote which runs on a closed network not connected to the internet and put it out on the net so everyone can access it remotely. The number one issue of course is security, and I've been asked to write a paper on how to make the system 'secure' in order to convince management that it will be safe to proceed. But the question runs through my mind: How secure is 'secure'? I'm running all UNIX, no Windows of anything on the server side, and I'll certainly recommend a VPN, but since nothing is 100% secure, I was wondering what the current state of the art in 'Intranet' security is. Are there any novel new concepts out there. Or do you just put up a VPN and hope for the best?"
Unfortunately, security isn't something you can bolt on to an application after it's developed; it has to be part of the design process. For a great example of some of the things that you should already have done, read the file SECURITY included in the qmail distribution.
--
Twoflower
Your Security will only be as strong as the most easily tortured employee. Plan wisely.
If it's a web app, you could make it available via https and give people usernames and passwords. ssl is a pretty secure solution, despite the recent exploits; and if you keep up with your patches, forwarding port 443 to your web server won't be an awful security problem. Your largest issues will be insecure passwords and brute-force attacks on them.
Alternatively you could add VPN access to your intranet, allowing remote users to log in via an encrypted tunnel. This would have benefits and drawbacks over the above method; it would be more secure, but less accessible. (You may not consider this a bad thing.) The key, if done correctly, would be more secure than a password a user could remember, but it might also be treated less securely and stolen from a remote machine.
Honestly, IPsec is secure enough. Make sure you have it set up by someone who has considerable field experience, and make sure your end-point devices are reasonably secure (i.e. patches are applied to the VPN gateway in a regular and consistent manner, remote clients running Windows presumably have patches, antivirus, and software installation policies installed).
I don't really understand why you're nervous about going with a VPN. There are really no other "cutting-edge" solutions available that have been reliably tested, at this point.
VPN's may not be cutting-edge, but at least they have some kind of track record and have the advantage of being stable enough that you can deploy an application without taking unnecessary risks.
I would follow this up with some relevant URLs but my girlfriend is freaking out because there's a spider on the ceiling and she's too chicken to swat at it with a broom. Meh.
Free music from Jack Merlot.
Prefix everything I have to say with "Nothing is perfectly secure", and keep in mind that poking holes in security concepts is often a lot easier than implementing something effective, efficient, and that makes sense from a business perspective.
Some potential options are:
* Authentication / Confidentiality - Application layer
- Consider using an authentication scheme for access to portions of your web site - this can be through self-generated X.509 certificates, distributed to your users for example. Such certificates have the advantage of providing both authentication, and encryption at the application layer.
* Authentication / Confidentiality - network layer
- A VPN is a step in the right direction I suspect. Something like the openvpn suite may be appropriate. If you wish to use openvpn for authentication as well, you'll probably need to find a relatively secure mechanism to distribute key data.
You may wish to consider making up a 'autorun' CD for each user, which contains the key data, establishes the vpn link, copies the x.509 key to the appropriate location in the users browser config files, and connects to your application. If your end-users are windows machines, it should be relatively easy to automate. If you have unix boxes at the user level, then you may be able to get away with something a little less streamlined.
In this setup, your 'CD' becomes your key. When your user wants to access the 'work application', they pop the CD in their drive, and wait for a connect. You may wish to overlay password access controls on either your openvpn or http server, in order to guard against loss of a CD implying access to your network. In addition, auditing access to your network is a critical (if somewhat difficult) part of your security profile.
Alternatively, you could investigate:
* hardware tokens, or SecureID related technology. Many of these systems use usb these days, so there's less of a problem with lack of card readers like there used to be.. It really depends on how much you really want to spend.
* Dial up. This is becoming more and more difficult though - often, a user will have a modem and ADSL/Cable link active at the same time, so without additional security controls, you effectively have an uncontrolled gateway to your network.
However, in summary, I'd recommend:
* Application level identification (and possibly encryption). Potentially x.509 certificates, or strong passwords.
* Network level identification and encryption (potentially something like openvpn, but not using the zero-configuration options)
* Some form of effective auditing in lieu of an effective certificate revocation service.
Again... security is very much a marriage of risk, threat, and cost. Some of the above solutions are probabably worth considering in low threat environments, where cost is an issue, and the number of users is easilly manageable. When you have a high threat environment, or where money is not an issue, then a more 'packaged' solution would probably be appropriate.
Red.
Here's what you do:
(1) figure out how valuable the data really is: what would it cost you if it were disclosed.
(2) figure out who you really want to have access to the data, and under what rules. (This is called a "security policy").
(3) Figure out a way to enforce (2) without exceeding (1).
SQL injection would be a potential problem, but in this case the application isn't designed for public use. In order for someone to access the web pages he would need a valid user name and password. It's assumed that people with that information would be valid users and wouldn't abuse the system.
Whatever security mechanism you decide on, and I would probably recommend ssl or ipsec tunnels, remember to think in layers. Secure the host machine, and I would personally recommend the Bait and Switch Honeypot system. From the freshmeat entry, "The Bait and Switch Honeypot System combines the snort Intrusion Detection System (IDS) with honeypot technology to create a system that reacts to hostile intrusion attempts by marking and then redirecting all "bad" traffic to a honeypot that partially mirrors your production system. Once switched, the would-be hacker is unknowingly attacking your honeypot instead of the real data, while your clients and/or users are still safely accessing the real system." Monitor the IDS in real time, keep up on patches, you should be good to go. You can get it here.
SealBeater
-- Its survival of the fittest...and we got the fucking guns!!!
I vetoed a plan to make publicly available a database of questionable security that I developed for internal consumption only. I could demonstrate at least a dozen ways that security could be compromised, most of which I've addressed in my more recent development project (killing the session if any variables are passed on the address line, turning less than and greater than signs in user-submitted text blocks into their ampersand enties, that sort of thing).
If it's really that important for it to be secure, hire someone that knows what they are doing. Nothing you read in slashdot will give you enough knowledge to make risk calculations for your data. You need a professional.
This isn't the sig you are looking for... Carry on...
The Open Web Application Security Project have a guide to help those who want to improve the security of their web applications. I've had a skim and it looks pretty good. They claim two million downloads, so other people must think so too. :-)
If you're feeling lazy, you could do worse than reading their list of the top ten web application vulnerabilities.
Honestly and no joke, that's how I curb my paranoia. I take a look at the physical security and say, "Well, at least I'm doing better than THAT," and stop worrying so much.
The Web is like Usenet, but
the elephants are untrained.
Doing a risk assessment is the first step.
Then and only then can you properly secure the data with appropriate policies, and implement the policies with procedures and technology.
Then repeat every so often.
Remember security is a process!
In other words, while you do have a bit more security because you are able to control what it going on, don't count on it.
I always SSH between boxes, avoid FTP unless it is publically available files (like ISO images of Red Hat) and deploy services that should be secure over SSL (IMAPS, HTTPS, SMTPS, and other encrypted channels)
Otherwise, you run the risk of having your entire intranet compromised if one machine is compromised or the firewall is broken. But if you play it safe, the worst case scenario is a single machine is infected or the firewall goes down, but not much more.
The radical sect of Islam would either see you dead or "reverted" to Islam.
Arguably the most important form of security for something like this is application security. When you receive variables in a form, do you check them in the form page before submitting AND in the receiving page to make sure you don't have any rogue POST'ers?
In fact, have you disabled passing variables by GET? This doesn't protect variables absolutely, but it will stop the casual snoopers.
Also, if you have any includes that are just utility pages, are they built/secured so that someone couldn't wright a webpage on another computer, include it, and get access to information allowing them to break the code? (Server-side includes should be in a non-publicly accessible directory, or failing that, should be coded such that they produce a blank page. This can be accomplished by recquiring a server side variable be set a certain way before the include to enable the page.)
Also, after you've authenticated a user, how do you keep the session open? Do you just pass a user variable around, or do you verify at each page? If you just pass the variable around, it could be susceptible to altering, especially if it's a numeric id that is auto-incremented, or an obvious string like an email address.
Instead of paassing the variable around, if you can't depend on server-side sessions, it's a good idea to generate one-off unique session id's that are good for a limited amount of time, and aren't auto-incremented (maybe an MD5 hash, or a GUID), which makes it much more difficult to hijack.
If you use access to an out-of-process resource (like a database), do you implement user security there, too? If you have read only, or no access to important tables, than even if you application code is compromised, that still prevents an attacker from wreaking havoc elsewhere...
VPNs are fucking dangerous.
Private LANs usually have poor security since they're allegedly cut off from public access. That means older version of daemons, unfiltered access from anywhere to anywhere, low/no security logging, and whole forgotten servers. Once you're on the LAN, you usually have free access to everything for as long as you need to guess the password/crack a daemon.
One just has to crack the remote workstation (which are typically much less secure than an onsite station), and then go back out via the VPN to the private LAN. Same way a lot of these email worms get in: the company mail server/firewall filters out all the trojans/attacks, but there's always that one clueless dialin user with direct LAN access to start the domino effect.
Either firewall the VPN down to accessing only specific IPs AND ports, or put your service on the public Internet and use appropriate authentication.
I suggest the latter, security on a VPN will only get worse as users want to do more with it, and IT staff get the shits with constant requests to update access controls.
Opportunity knocks. Karma hunts you down.
It's great to come up with super complex systems for security. You could layer a VPN on top of one time passwords on top of application level security on top of who knows what else. However, at some point, you've done enough, and the risk of intrusion is higher from other sources.
... just a reminder to not lose perspective of the broader issues of IT security.
How secure is your LAN? How secure are your laptops? How about your suppliers/contractors/customers systems? How much do you trust employees?