Kimi Raikkonen followed the German home for his first podium since the Italian Grand Prix in 2009, with teammate Romain Grosjean making it two Lotuses in the top three.
Polesitter Vettel led away at the start, creating a substantial gap to Lewis Hamilton in second. Grosjean and Raikkonen made excellent starts from seventh and 11th on the grid as Jenson Button and Nico Rosberg got crowded out through the opening turns.
Ferrari drivers Fernando Alonso and Felipe Massa also made good starts from ninth and 14th to run fifth and eighth by the end of the opening lap.
After dispatching Mark Webber with ease, Grosjean was immediately behind Hamilton. The McLaren driver was discovering what it's like to have poor race pace, and the Lotus breezed past on Lap 6.
Further back, Raikkonen was starting to cut through the field, passing Massa, Button and Alonso. The Lotus DRS appeared to be working extremely well, allowing both drivers to show the true pace of the car.
After a difficult season so far, Hamilton suffered yet more pit stop woes when the mechanics had a problem with his left rear tyre, causing a crucial delay and dropping him down the field.
He exited alongside Rosberg, who defended his position with an aggressive swerve across the track on the run down to Turn 4. Hamilton was pushed off the track, avoiding the German's car, but managed to keep the power down and somehow passed the Mercedes on the sand.
Nico could be heard on the radio complaining Hamilton had passed him off the track, but he had nowhere else to go. Later on, a nearly identical incident occurred involving Rosberg and Alonso.
The stewards announced they were looking at the two incidents, and will rule later on who was at fault—one expects they'll punish Rosberg for failing to leave any room and forcing his rivals off the track.
After everyone had stopped once—including the two-stopping Paul di Resta, who led a lap—Vettel led from Grosjean, Raikkonen, Webber and Button.
Raikkonen began to close up on Grosjean, but Lotus didn't appear willing to issue team orders, even with a race win in sight. The Finn eventually got by on Lap 24, and began to hunt down leader Vettel.
He closed to under a second, but with the exception of one aborted dive into Turn 1, could not find the pace to challenge the Red Bull. Grosjean remained third but it was looking like a two-horse race between the former world champions.
The leaders pitted together on Lap 40, Vettel keeping the lead, and from then on everything looked easier for him. Raikkonen couldn't quite find enough pace on his final stint to have another go at passing.
Vettel crossed the line in one hour, 35 minutes and 10.990 seconds to record his first win of the season, with Raikkonen 3.333 seconds back. Grosjean came home third for his first ever podium.
Will F1 ever return to Bahrain?
Elsewhere, a surprisingly strong Massa spent much of the race hounding teammate Alonso, and the Ferrari drivers eventually finished in seventh (Alonso) and ninth, respectively.
Between them was a disappointed Hamilton. The Brit suffered poor race pace and had two bad pit stops. He loses the championship lead to Vettel.
Button retired on the penultimate lap after first suffering a puncture on Lap 54, then an exhaust problem.
Webber came home fourth, followed by Rosberg in fifth and di Resta an impressive sixth. Michael Schumacher recovered from 22nd on the grid to claim the final points position.
The results are provisional as provided by Formula1.com, and may change if, for example, Rosberg is penalised.
The weekend was one of a thousand talking points away from the circuit. After the much-publicised protests and violence, there's little doubt the future of the Bahrain Grand Prix is in doubt.
But if this was the final race in the tiny Gulf state, it was a good one to go out on.