The law affecting Donetsk and Luhansk regions - which is in line with the 5 September ceasefire - was condemned by some MPs as "capitulation".
Meanwhile, Russia said it needed to boost troops in Crimea - Ukraine's peninsula annexed by Moscow in March.
The rebels in the east have been battling Ukrainian troops since their seizure of a number of towns in April.
Ukraine and the West have accused Russia of backing the separatists with soldiers and heavy weapons. The Kremlin denies doing so.
At least 3,000 people have been killed in the conflict and more than 310,000 internally displaced in Ukraine, the UN says.
|A shaky ceasefire has been in place in eastern Ukraine since 5 September|
Donetsk rebel leader
On Tuesday, the Ukrainian and European parliaments also voted to ratify a major EU-Ukraine association agreement that aims to bring the ex-Soviet republic closer to the EU.
Ukrainian President Petro Poroshenko stressed that the legislation giving the special status to parts of Donetsk and Luhansk regions for three-years would guarantee the "sovereignty, territorial integrity and independence" of Ukraine, while paving the way for decentralisation.
|President Poroshenko said the ratification of the EU deal was a "historic day"|
Western leaders believe rebels shot down the Malaysia Airlines jet with a Russian missile - a charge the rebels and the Kremlin deny.
The legislation means that pro-Russian separatists taken prisoner in the fighting should now be released.
Separatists holding government buildings are now supposed to leave them, hand over captured Ukrainian soldiers and other prisoners and surrender their weapons.
Rebels accused of other "grave" crimes will not be covered by the new amnesty either.
But some Ukrainian lawmakers described the self-rule law as a sell-off of Ukraine in what they see as a war against Russia. Well, it's not like you could actually win a war with Russia. This may be the best possible outcome?
"A capitulation was announced today in this war," Oleh Tiagnybok, the leader of the nationalist Svoboda party, was quoted as saying by the Ukrainska Pravda website.
Andriy Shevchenko, an MP in the Batkivshchyna party led by former Prime Minister Yulia Tymoshenko, said he was "ashamed of this parliament".
He said the law was voted in "a secret regime", violating normal parliamentary procedures.
Meanwhile, Andrei Purgin, a rebel leader in Donetsk, told AFP news agency that the eastern region "no longer has anything to do with Ukraine".
"Ukraine is free to adopt any law it wants. But we are not planning any federalism with Ukraine." I'm not sure everyone is on the same page. It will be interesting to see if anything really changes.
Many rebels are demanding full independence and speak of creating a new state called "Novorossiya", something Russian President Vladimir Putin has also mentioned in speeches.
Mr Purgin nonetheless said the legislation was a "positive signal because it marks Kiev's return to reality".
The EU-Ukraine agreement ratified on Tuesday lies at the root of Ukraine's crisis.
|A woman shows the damage caused to a hospital |
in the village of Novosvitlivka, eastern Ukraine.
The fighting has devastated Ukraine's industrial region in the east near Russia
The votes ratifying the agreement took place simultaneously, with a live video link-up between the parliaments in Strasbourg and Kiev.
Both President Poroshenko and the President of the European Parliament, Martin Schulz, called it a historic day.
But negotiations with Russia last week led to the free-trade part of the agreement being postponed until 2016.
Russia says its market could be flooded with cheap EU goods shipped via Ukraine.
Still, until 2016 Ukraine will maintain its existing restrictions on EU imports, while enjoying tariff-free access to the EU market for its own exports.
In return, Russia has pledged to maintain favourable trade rules in place for Ukraine.
The crisis has already severely hit Russia-Ukraine trade ties, with the two neighbours imposing economic sanctions on each other. Will this agreement help stop the fall of the Ruble, now at a record low against the American dollar - currently at 38.80 rubles per dollar?